Escape-Characters

刪除 unix .csv 文件中所有類型的特殊字元

  • May 17, 2018

我正在處理來自包含特殊字元的源的大量 CSV 數據,例如:

`÷ Þ Ÿ ³ Ù ÷`

以下是數據集中包含這些字元的範例行:

'÷ÞW' , 'ŸŸŸŸŸŸŸ', '³ŸŸÙ÷'

這是取自不同數據集的另一個範例:

WCP16,2013-06-04 20:06:24,2013-06-04,CPU,PrimeNumberGenerationTest,PASS,USA,H‌​F0SXV1,,,N,9999
WCP06,2013-06-04 20:06:24,2013-06-04,CPU,RegisterTest,PASS,USA,HF0SXV1,,,N,99‌​99
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字元。有一些不同的工具可能對您有用。我首先想到的幾個是:

  1. iconv(國際化轉換)
  2. tr(翻譯)
  3. 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' , '', ''

引用自:https://unix.stackexchange.com/questions/403015