2013-02-13 77 views
0

取代重音/音調符號/非ASCII字符中的固定寬度的文件需要使用外殼腳本來代替重音/音調符號/非ASCII字符與空間中的固定寬度的文件/ AWK/perl的需要使用Space

我們有一個固定寬度的文件,它在一個固定寬度的文件中有重音/變音符號/非ASCII字符。該文件是通過從數據庫提取數據並將其假脫機到文件生成的。這裏的主要問題是當我們查詢數據庫時,在數據庫客戶端控制檯上可見這些重音符號/音調符號/非ASCII字符。但是,當我們將這些數據提取到文件並在putty框中打開文件時,我們無法看到這些字符。

例如,我們看到的JEANNOýýýýýýL數據庫中的控制檯,但在泥盒,我們把它看作JEANNOL

爲了解決這個問題我想下面的方法。

二手OD - 一個-tu1命令查找文件中的每個字符的ASCII值。對於所有這些重音符號/符號/非ASCII字符,我將ASCII值作爲空值,我用空格的ASCII字符替換它。然後我打印這些ASCII值的字符。這裏的問題是一些空間是真正的輸入記錄被刪除,並搞亂了這個固定寬度文件的列結構。

欲保持在固定寬度的文件的每個記錄同一行長度甚至i之後替換的使用Space重音字符的ASCII值。

我可以幫助解決這個問題嗎?

感謝

+1

什麼是 「打開箱子膩子文件」 的方式呢?我想你可能是指PuTTY telnet/ssh客戶端,但據我所知,它不打開文件。 – ikegami 2013-02-13 04:22:56

+0

@ikegami在它的感覺vi編輯器中的Putty框可用。或者如果我做文件貓。 – Chkusi 2013-02-13 04:24:40

+0

是否從會話運行db客戶機和'cat'?您希望「JEANNOýýýýýýL」的文件中有哪些字節?您的PuTTY會話的窗口/翻譯/「接收的數據假定爲」中列出了哪些編碼? – ikegami 2013-02-13 04:27:36

回答

1

我覺得你的數據庫包含了所有未通過ETL處理程序處理UTF8編碼字符。

處理此問題的最佳方法是更改​​ETL過程並刪除這些字符。

另一種方法是使用這些正則表達式。對於第二個你需要使用最近的Perl(我使用5.10.1)。

cat file | perl -lne 's!\x{00}! !g;print' > good_file. <-- this will replace every null to space 

cat file | perl -lne 's![^[:ascii:]]! !g;print' > good_file. <-- this will replace every non ascii char to space 
+0

謝謝。你能否也請讓我知道我可以用一個空格替換一系列ASCII字符或特定的ASCII字符。我們也有我們的Perl 5.8.4,你只提到Perl 5.10.1的第二個命令。有沒有其他的方式來處理這個問題? – Chkusi 2013-02-13 16:18:50

0

一個用sed的

sed -i 's:[^[:print:]]:g' infile