큰따옴표를 제거하고 그 안의 쉼표를 바꾸세요.

큰따옴표를 제거하고 그 안의 쉼표를 바꾸세요.

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

관련 정보