刪除 unix .csv 文件中所有類型的特殊字元
我正在處理來自包含特殊字元的源的大量 CSV 數據,例如:
`÷ Þ Ÿ ³ Ù ÷`
以下是數據集中包含這些字元的範例行:
'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'
這是取自不同數據集的另一個範例:
WCP16,2013-06-04 20:06:24,2013-06-04,CPU,PrimeNumberGenerationTest,PASS,USA,HF0SXV1,,,N,9999 WCP06,2013-06-04 20:06:24,2013-06-04,CPU,RegisterTest,PASS,USA,HF0SXV1,,,N,9999 WCD42,2013-06-04 20:06:24,2013-06-04,DVDMINUSRW,MainICTest,PASS,USA,HF0SXV1,,,N,9999 WCP09,2013-06-05 01:52:53,2013-06-05,CPU,SSE3Test,PASS,,?÷ÞQ»,,,N,9999 WCP10,2013-06-05 01:52:53,2013-06-05,CPU,SSE4_1Test,PASS,,?÷ÞQ»,,,N,9999
如果我知道預期的字元類型,那麼我可以在讀取文件時在Informatica中處理它。
但是在我的情況下,我不確定在任何一天我會得到什麼類型的數據,因此我的工作失敗了。所以我需要一種從數據中刪除所有特殊字元的方法。
我不確定你所說的“特殊字元”到底是什麼意思,所以我假設你想擺脫非ASCII字元。有一些不同的工具可能對您有用。我首先想到的幾個是:
iconv
(國際化轉換)tr
(翻譯)sed
(流編輯器)
iconv
(國際化轉換)這是使用iconv的解決方案:
iconv -c -f utf-8 -t ascii input_file.csv
-f
標誌 ( from ) 指定輸入格式,標誌-t
( to ) 指定輸出格式,-c
標誌告訴iconv
丟棄無法轉換為目標的字元。這會將結果寫入標準輸出(即您的控制台)。如果要將結果寫入新文件,則可以執行以下操作:iconv -c -f utf-8 -t ascii input_file.csv -o output_file.csv
然後,如果需要,可以將原始文件替換為新文件:
mv -i output_file.csv input_file.csv
以下是如何
iconv
處理您的第一個範例字元串:$ echo "'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'" | iconv -c -f utf8 -t ascii 'W' , '', ''
tr
(翻譯)這是使用tr(翻譯)命令的解決方案:
cat input_file.csv | tr -cd '\000-\177'
該模式使用八進製
\000-\177
表示法指定數字範圍 0-127 。這是 ASCII 字元的值範圍。該標誌告訴匹配該範圍的補碼中的值(即匹配非ASCII字元),並且該標誌告訴執行刪除(而不是翻譯)。-c``tr``-d``tr
要將結果寫入文件,您將使用輸出重定向:
cat input_file.csv | tr -cd '\000-\177' > output_file.csv
以下是如何
tr
處理您的第一個範例字元串:$ echo "'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'" | tr -cd '\000-\177' 'W' , '', ''
sed
(流編輯器)這是使用sed的解決方案:
sed 's/[\d128-\d255]//g' input_file.csv
s
前綴告訴sed
執行替換,後綴g
告訴sed
全域匹配模式(預設情況下只匹配第一個匹配項),模式[\d128-\d255]
告訴sed
匹配具有 128-255 範圍內的十進制值的字元(即非 ASCII 字元),以及第二個和第三個正斜杠之間的空字元串告訴sed
用空字元串替換匹配的模式(即刪除它們)。與許多其他程序不同,
sed
它可以選擇就地更新文件(而不是手動寫入不同的文件然後替換原始文件):sed -i 's/[\d128-\d255]//g' input_file.csv
以下是如何
sed
處理您的第一個範例字元串:$ echo "'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'" | sed 's/[\d128-\d255]//g' 'W' , '', ''