.csv 파일의 문자 인코딩을 UTF-8로 변환

.csv 파일의 문자 인코딩을 UTF-8로 변환

LinkedIn 연결을 내보낼 때:
https://www.linkedin.com/connected/manage_sources
Microsoft Outlook CSV 파일을 받았습니다.

CSV.read하지만 Ruby를 사용하여 파일에 액세스 하려고 하면 다음 오류가 발생합니다.

invalid byte sequence in UTF-8

Excel에서 CSV를 연 다음 UTF-8 인코딩을 사용하면 Save AsCSV를 올바르게 인코딩 할 수 있습니다.

하지만 저는 Excel을 전혀 사용하지 않고도 명령줄에서 이 작업을 수행할 수 있기를 정말로 원합니다.

나는 읽었다또 다른 대답이는 iconv옵션일 수 있습니다. 하지만 작동시킬 수 없습니다.

iconv -f US-ASCII -t UTF-8 test/fixtures/1481995385116.csv

실수:

iconv: test/fixtures/1481995385116.csv:145:19: cannot convert

파일 형식을 확인하면 다음과 같은 결과가 나타납니다.

test/fixtures/1481995385116.csv: Non-ISO extended-ASCII text, with very long lines, with CRLF, LF line terminators

사용할 수 있는 다른 CLI가 있습니까, 아니면 iconv잘못 사용하고 있습니까?

편집하다:

제안된 대로 출력은 다음과 같습니다 hexdump.

➜  c/t/fixtures master ✗ hexdump 1482372034326.csv|head
0000000 22 54 69 74 6c 65 22 2c 22 46 69 72 73 74 20 4e
0000010 61 6d 65 22 2c 22 4d 69 64 64 6c 65 20 4e 61 6d
0000020 65 22 2c 22 4c 61 73 74 20 4e 61 6d 65 22 2c 22
0000030 53 75 66 66 69 78 22 2c 22 45 2d 6d 61 69 6c 20
0000040 41 64 64 72 65 73 73 22 2c 22 45 2d 6d 61 69 6c
0000050 20 32 20 41 64 64 72 65 73 73 22 2c 22 45 2d 6d
0000060 61 69 6c 20 33 20 41 64 64 72 65 73 73 22 2c 22
0000070 42 75 73 69 6e 65 73 73 20 53 74 72 65 65 74 22
0000080 2c 22 42 75 73 69 6e 65 73 73 20 53 74 72 65 65
0000090 74 20 32 22 2c 22 42 75 73 69 6e 65 73 73 20 53
➜  c/t/fixtures master ✗ file 1482002728101.csv
1482002728101.csv: UTF-8 Unicode text, with very long lines, with CR line terminators
➜  c/t/fixtures master ✗ file 1482372034326.csv
1482372034326.csv: Non-ISO extended-ASCII text, with very long lines, with CRLF, LF line terminators
➜  c/t/fixtures master ✗ hexdump -c 1482002728101.csv|head
0000000   T   i   t   l   e   ,   F   i   r   s   t       N   a   m   e
0000010   ,   M   i   d   d   l   e       N   a   m   e   ,   L   a   s
0000020   t       N   a   m   e   ,   S   u   f   f   i   x   ,   E   -
0000030   m   a   i   l       A   d   d   r   e   s   s   ,   E   -   m
0000040   a   i   l       2       A   d   d   r   e   s   s   ,   E   -
0000050   m   a   i   l       3       A   d   d   r   e   s   s   ,   B
0000060   u   s   i   n   e   s   s       S   t   r   e   e   t   ,   B
0000070   u   s   i   n   e   s   s       S   t   r   e   e   t       2
0000080   ,   B   u   s   i   n   e   s   s       S   t   r   e   e   t
0000090       3   ,   B   u   s   i   n   e   s   s       C   i   t   y
➜  c/t/fixtures master ✗ hexdump -c 1482372034326.csv|head
0000000   "   T   i   t   l   e   "   ,   "   F   i   r   s   t       N
0000010   a   m   e   "   ,   "   M   i   d   d   l   e       N   a   m
0000020   e   "   ,   "   L   a   s   t       N   a   m   e   "   ,   "
0000030   S   u   f   f   i   x   "   ,   "   E   -   m   a   i   l
0000040   A   d   d   r   e   s   s   "   ,   "   E   -   m   a   i   l
0000050       2       A   d   d   r   e   s   s   "   ,   "   E   -   m
0000060   a   i   l       3       A   d   d   r   e   s   s   "   ,   "
0000070   B   u   s   i   n   e   s   s       S   t   r   e   e   t   "
0000080   ,   "   B   u   s   i   n   e   s   s       S   t   r   e   e
0000090   t       2   "   ,   "   B   u   s   i   n   e   s   s       S

출력에서 형식을 어떻게 알 수 있나요?

답변1

$ iconv -f windows-1252 -t utf-8 linkedin_contacts.csv
.
.
.
"","Ahmet XXXXX","","??
iconv: linkedin_contacts.csv:665:23: cannot convert
$ cat linkedin_contacts.csv|grep Ahmet|hexdump -C| sed -n '1,2p'
00000000  22 22 2c 22 41 68 6d 65  74 20 53 61 6c 69 68 22  |"","Ahmet XXXXX"|
00000010  2c 22 22 2c 22 3f 3f 8d  65 6e 22 2c 22 22 2c 22  |,"","??.en","","|

8d값을 확인해 봤는데ASCII 테이블ISO 8859-1의 변형인 것 같습니다. 처리가 가능한지 iconv --list | grep 8859-1확인해 보세요 .iconv

$ iconv -f ISO-8859-1 -t UTF-8 linkedin_contacts.csv > foo.rb
$ file foo.rb
foo.rb: UTF-8 Unicode text, with very long lines, with CRLF, LF line terminators

이 두 개의 터미네이터를 갖는 것은 여전히 ​​Ruby가 처리해야 할 문제이지만, 끝 부분을 잘라내면 모든 것이 괜찮습니다 :)

$ sed '$ d' foo.rb > bar.csv
$ file bar.csv
bar.csv: UTF-8 Unicode text, with very long lines, with CRLF line terminators

관련 정보