將 .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 然後Save As使用 UTF-8 編碼對其進行正確編碼。

但是,我真的希望能夠從命令列執行此操作,而根本不必使用 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

相關內容