필드의 구분 기호를 이스케이프하는 동안 구분 기호 문자 변환

필드의 구분 기호를 이스케이프하는 동안 구분 기호 문자 변환

로 구성된 필드가 있는 텍스트 파일이 있습니다 . 이를 일반적인 CSV |로 변환하고 싶습니다 . ,나는 이것을 사용해 보았습니다 :

sed 's/|/,/g' test.txt > test.csv

그러나 일부 필드에는 이미 쉼표가 있습니다. 예를 들어:

var1|var2|var3
Potter, Harry|2|3

어떻게 해야 합니까?

답변1

올바른 csv 파서 도구를 사용하세요.

csvtool -t '|' -u ',' cat infile > outputfile
var1,var2,var3
"Potter, Harry",2,3

에서 csvtool --help:

-t   Input separator char.  Use -t TAB for tab separated input.
-u   Output separator char.  Use -u TAB for tab separated output.
cat
    This concatenates the input files together and writes them to
    the output.  You can use this to change the separator character.  

답변2

쉼표가 포함된 값만 인용:

$ sed 's/[^|]*,[^|]*/"&"/; y/|/,/' <infile
var1,var2,var3
"Potter, Harry",2,3

입력에 이미 큰따옴표 문자가 포함되어 있고 CSV 형식(예: Riddle, Tom "Voldemort"|4|5)으로 사용되지 않는 경우 대부분의 CSV 형식에 대해 다음을 사용하여 이스케이프할 수 있습니다 "".

$ sed 's/"/""/g; s/[^|]*[,"][^|]*/"&"/; y/|/,/' <infile
"Riddle, Tom ""Voldemort""",4,5

답변3

이 시도

sed 's/|/","/g; s/^/"/; s/$/"/' file 

그러면 다음과 같은 출력이 생성됩니다.

"var1","var2","var3"
"Potter, Harry","2","3"

설명하다:

각 열 주위에는 따옴표를 사용해야 합니다 "".

  • 먼저 따옴표 출력의 모든 항목을 쉼표 로 s/|/","/g바꿉니다 .|","var1","var2","var3 Potter, Harry","2","3

  • 두 번째는 s/^/"/줄의 시작 부분을 따옴표로 대체합니다. 이는 ^줄의 시작을 의미합니다.

  • 세 번째는 s/$/"/줄 끝을 따옴표로 바꿉니다. 여기서 $줄 끝을 의미합니다.

아래와 같이 각 쉼표 앞에 백슬래시를 사용하여 필드에서 쉼표를 이스케이프할 수도 있습니다.

Potter\, Harry,2,3

여기에서 csv 형식에 대한 자세한 내용을 읽을 수 있습니다.https://www.csvreader.com/csv_format.php

답변4

\w를 포함하도록 정규식을 수정할 수 있습니다. 마녀는 모든 영숫자와 일치하고 _ 뒤에 |가 옵니다.

 #sed 's/\w|/,/g' example.csv 
 var1|var2|var3
 Potter, Harry|2|3

관련 정보