CSV 형식이 필요함

CSV 형식이 필요함

아래와 같은 값의 예가 포함된 CSV 파일이 있습니다.

"Basic","""21,21""","[""21"",""21""]","","","","",""

2 및 3과 같은 일부 열에서 추가 큰따옴표를 제거해야 합니다.

예상 출력은 다음과 같습니다

"Basic","21,21","[21,21]","","","","",""

awk, sed 또는 기타 Linux 도구를 사용하여 이를 어떻게 달성할 수 있습니까?

아래에 더 많은 파일 예가 언급되어 있으며, 이 열의 값은 항상 []에 있으며, [] 안의 따옴표를 제거해야 합니다.

"Basic","""40""","[""40""]","""13F""","[""13F""]","","" 
"Basic","""0""","[""0""]","","","""MCOMB""","[""MCOMB""]"

답변1

이해하는 CSV 파서를 사용하십시오.CSV인용된 필드 내에 따옴표, 쉼표 등을 삽입하는 것은 단순한 쉼표로 구분된 필드보다 조금 더 복잡할 수 있습니다.

밀러아래와 같이 좋은 명령줄 도구입니다csvkit.

또는 Perl 또는 Python과 같은 언어로 csv 구문 분석 라이브러리를 사용하십시오.텍스트::CSV펄의 경우 또는데이터 세트파이썬의 경우.

Linux를 사용하는 경우 사용 중인 배포판에 관계없이 이들 모두가 패키지로 제공될 수 있습니다.

답변2

답변3

sed해결책이 있어요

sed -e 's/,"""/,"/g' -e 's/""",/",/g' -e 's/\([^,]\)""/\1/g' -e 's/""\([^,]\)/\1/' 

이것은 만든다

"Basic","40","[40]","13F","[13F]","",""
"Basic","0","[0]","","","MCOMB","[MCOMB]"
"Basic","21,21","[21,21]","","","","",""

sed 명령은 매우 간단합니다.

  • 's/,"""/,"/g'다음 항목을 모두 ,"""바꿉니다 .,"g
  • 's/\([^,]\)""/\1/g'쉼표가 아닌 문자 [^,]와 두 개의 "기억된 문자를 찾아 \( \)기억된 문자로 바꿉니다.\1

줄 끝의 후행 공백은 마지막 공백을 제거합니다.""

@cas가 지적했듯이 csv 도구를 사용하면 장기적으로 더 나을 것입니다.

답변4

데이터에서 모든 큰따옴표, 즉 CSV 형식의 큰따옴표와 포함된 따옴표, 쉼표 및 개행을 인용하는 데 필요한 큰따옴표가 아닌 모든 큰따옴표를 제거한다고 가정합니다.

csvformatcsvkit을 사용하여 tr각 필드에 대한 내부 참조를 제거합니다.

$ cat file
"Basic","""40""","[""40""]","""13F""","[""13F""]","",""
"Basic","""0""","[""0""]","","","""MCOMB""","[""MCOMB""]"
"Basic","""21,21""","[""21"",""21""]","","","","",""
$ csvformat -Q "'" file | tr -d '"' | csvformat -q "'"
Basic,40,[40],13F,[13F],,
Basic,0,[0],,,MCOMB,[MCOMB]
Basic,"21,21","[21,21]",,,,,

위 파이프라인은 먼저 CSV 파일에 사용된 따옴표 문자를 큰따옴표에서 작은따옴표로 변경합니다. 이 tr명령은 나머지 큰따옴표(부분 데이터)를 모두 제거합니다. 마지막 csvformat명령은 데이터를 큰따옴표를 사용하여 다시 변환합니다.

빈 필드를 포함하여 모든 필드를 참조해야 하는 경우 의 두 번째 호출에 추가 -U 1하세요 csvformat. 기본적으로 csvkit 유틸리티는 필요한 필드에 대해서만 따옴표를 출력합니다.

관련 정보