필드에 반환된 문자가 포함된 csv 파일의 각 레코드 끝에 문자를 추가하세요.

필드에 반환된 문자가 포함된 csv 파일의 각 레코드 끝에 문자를 추가하세요.

다양한 길이의 5개 열이 있는 csv 파일이 있습니다. 열 사이의 구분 기호는 이며 ",", 마지막 열은 로 끝납니다 ". 줄 구분 기호는 개행 문자입니다. 최신 파일에는 줄 바꿈이 있으므로 마지막 열의 텍스트에 이를 유지해야 합니다.

각 줄 끝의 줄 바꿈을 레코드 구분 기호로 사용하여 이 파일을 가져왔지만 이제 텍스트 마지막 열의 줄 바꿈으로 인해 가져오기 프로그램에서 오류가 발생합니다. 개행 문자가 필드 중 하나에 있다는 것을 인식하는 것은 충분히 똑똑하지 않습니다. 따라서 올바르게 가져오려면 새 줄 끝 구분 기호를 만들고 쉘 명령을 사용하여 각 줄 끝에 삽입해야 합니다. 완료되었습니다.

일반적으로 사용되는 명령에는 GNU 기능이 없으므로 더욱 어렵습니다. 저는 AIX에서 kornshell을 사용하고 있습니다. 다른 소프트웨어를 설치할 수 없습니다.

예:

"id1","column2 with text","3","4/4/2044","the 
column
that messes everything up"
"id2",""column2 with text","42","9/9/2099","oh no,
not
again
!!"

쉘 명령(awk, sed, perl, tr 등)과 |@|를 구분 기호로 사용하여 위 예에서 라인 1이 다음과 같이 종료되도록 각 줄 끝에 새 구분 기호를 삽입하려면 어떻게 해야 합니까?

that messes everything up"|@|

2행은 다음으로 끝납니다.

!!"|@|

각 줄 끝에서 개행 문자를 제거할 필요가 없습니다. 가져오기 도구는 줄 끝 구분 기호의 일부가 아닌 경우 이를 무시합니다.

답변1

"모든 레코드가 a 다음에 개행 문자로 끝나고 a "다음에 개행 문자가 오는 유일한 시간이 레코드의 끝이라고 안전하게 가정할 수 있다면 이는 상대적으로 간단합니다.

$  sed 's/(.*")$/\1|@|/' file 
"id1","column2 with text","3","4/4/2044","the 
column
that messes everything up"|@|
"id2",""column2 with text","42","9/9/2099","oh no,
not
again
!!"|@|

또는 다음 뒤에 공백을 허용하십시오 ".

sed 's/"[[:blank:]]*$/"|@|/' file

물론 이것은 견고하지 않습니다. CSV 파일에서 허용되기 때문에 필드에 큰따옴표를 사용할 가능성이 높습니다. 즉, 필드와 개행 앞에 큰따옴표를 사용할 수 있습니다. 이런 일이 발생하면 나의 단순한 접근 방식은 실패할 것이며 실제로 적합한 파서를 작성하거나 적합한 csv 파서가 있는 perl 또는 python과 같은 도구를 사용해야 합니다.

관련 정보