
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##
두 경우 모두 샘플_ups1이 내 출력 파일입니다.
답변1
유효한 CSV가 있는 경우 적절한 CSV 파서를 사용해야 합니다. Ruby는 사용하기 쉽습니다: 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
이 데이터 라인을 구문 분석하고 인용된 필드 안에 따옴표를 그대로 두는 방법이 있습니다. 이는 AND 가 다음과 같지 않은지
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