큰따옴표 제거 및 그 안에 쉼표 대체

큰따옴표 제거 및 그 안에 쉼표 대체

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_charquote_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

관련 정보