CSV 형식 파일에서 큰따옴표 한두 개를 제거하고 그 안의 쉼표를 공백으로 바꿔 전체 필드가 하나로 보이도록 할 수 있는 명령을 찾고 있습니다.
예: csv의 한 열 아래에 ""Wembley,London""
표시됩니다 .Wembley London
또한, "Wembley, London"의 구령은 Wembley London이다. 스크립트는 필드 위치에 관계없이 파일을 읽습니다.
다음 명령을 시도했지만 작동하지 않았습니다.
sed 's/\"//g' $fname > $Target/sample_UPS1.csv
sed 's/\,/ /g' $Target/sample_UPS1.csv > $Target/sample_UPS1.csv
awk -F'""' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", " ", $i) } 1' $fname | sed 's/\"//g' > $Target/sample_UPS.txt ##For removal of two double quotes and substitution of comma with a space##
awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(",", " ", $i) } 1' $Target/sample_UPS.txt | sed 's/\"//g' > $Target/sample_UPS1.txt ##For removal of double quotes and substitution of comma with a space##
두 경우 모두 Sample_ups1이 내 출력 파일입니다.
답변1
유효한 CSV가 있는 경우 적절한 CSV 파서를 사용해야 합니다. 루비는 사용하기 쉽습니다: if
cat file.csv
"""Wembley,London""",a,"b","c, ""d e"", ""f,g"",h"
그 다음에
ruby -e '
require "csv"
data = CSV.read ARGV.shift
data.each {|row|
row.each {|field| field.delete! "\""; field.tr! ",", " "}
puts CSV.generate_line row
}
' file.csv
Wembley London,a,b,c d e f g h
CSV 필드에는 따옴표가 포함되어 있습니다.이중 견적을 요청하세요. 당신이 가지고 있다면
""Wembley,London"","other stuff",...
그렇다면 CSV의 형식이 올바르지 않습니다.
답변2
진주의텍스트::CSV모듈은 다음과 같은 유형의 잘못된 CSV를 처리할 수 있습니다.
CSV 데이터가 정말 나쁜 경우.
1,"foo "bar" baz",42
또는
1,""foo bar baz"",42
이 데이터 행을 구문 분석하고 인용된 필드 내에서 인용문을 그대로 유지하는 방법이 있습니까? 이는 다음과 같지 않게 설정
allow_loose_quotes
하고 보장함으로써 달성할 수 있습니다.escape_char
quote_char
예를 들어
echo 'a,b,c,1234,23,""Wembley,London"",267,agty' |
perl -MText::CSV -lne '
BEGIN{$p = Text::CSV->new( {allow_loose_quotes => 1, escape_char => "\\"} )}
print join ",", map { s/,/ /g; s/"//g; $_ } $p->fields() if $p->parse($_)
'
a,b,c,1234,23,Wembley London,267,agty