csv 파일 구문 분석, 구분 기호 교체, "" 사이의 필드 내용 무시

csv 파일 구문 분석, 구분 기호 교체, "" 사이의 필드 내용 무시

구분 기호가 있는 파일이 있습니다 ;. 내 응용 프로그램은 이러한 구분 기호를 기반으로 데이터를 구문 분석합니다. 문자열 필드는 열 사이 ""와 열 내에 있으며 텍스트로 구분 기호를 사용할 수 있습니다. 해당 파일의 구분 기호를 바꾸고 싶습니다(예: 로 변경 |) "". 예는 다음과 같습니다.

입력하다:

"BARCELONA";"";"Country.666;53;98";15;19;"test";4343;63647;655848

산출

"BARCELONA"|""|"Country.666;53;98"|15|19|"test"|4343|63647|655848

답변1

정확한 출력을 얻으려면,

$ perl -MText::CSV -lpe '
    BEGIN{$p = Text::CSV->new({sep_char => ";"})} 
    $_ = join "|", map { /^\d+$/ ? $_ : qq("$_") } $p->fields() if $p->parse($_)
  ' INPUT
"BARCELONA"|""|"Country.666;53;98"|15|19|"test"|4343|63647|655848

틀에 얽매이지 않는 언급을 고집하지 않는다면,

$ csvformat -d';' -D'|' INPUT
BARCELONA||Country.666;53;98|15|19|test|4343|63647|655848

숫자가 아닌 값을 참조하도록 입력 및 출력을 강제합니다.거의원하는 방식으로 작동하지만 분명히 숫자 필드를 부동 소수점으로 승격합니다.

$ csvformat -d';' -u2 -D'|' -U2 INPUT
"BARCELONA"|""|"Country.666;53;98"|15.0|19.0|"test"|4343.0|63647.0|655848.0

답변2

현장에서 데이터를 변경하는 것은 안전하지 않습니다.

csv 파일을 구문 분석하려면 다음을 사용할 수 있습니다.csvtool

$ echo '"BARCELONA";"";"Country.666;53";15' | csvtool -t ';' col 1- -
BARCELONA,,Country.666;53,15

또는 특정 지역을 타겟팅

$ echo '"BARCELONA";"";"Country.666;53";15' | csvtool -t ';' col 1,3 -
BARCELONA,Country.666;53    

답변3

이렇게 하면 쉬울 거라 생각했는데 awk, 결국 좀 혼란스러웠습니다. 그러나 이 문제로 어려움을 겪고 있으므로 awk해당 기능을 활용하는 FPAT잠재적인 솔루션은 다음과 같습니다.

cat file.txt | awk -v FPAT='[^;]+|"[^"]+"' '{ for( col=1; col<=NF; col++ ) { printf "%s|", $col; } print "" }'

FPAT기본적으로 정규식을 사용하여 항목으로 분류되는 항목을 정의하고(세미콜론이나 따옴표 없이) |열 사이에 ( ) 문자를 사용하여 다시 인쇄합니다. 원래는 해당 OFS옵션을 사용하려고 했으나 FPAT잘 작동하지 않는 것 같습니다 .

답변4

GNU sed확장 정규식이 활성화된 편집기를 사용하여 이 작업을 수행 할 수 있습니다 .

$ sed -Ee 's/(("[^"]*")+|[^;]+);/\1|/g' in.csv

관련 정보