Text-Processing
在特定字元串之間查找並添加引號
當我使用 csv 時,不需要的逗號 (’,’) 會誤導我的 csv 文件,從而導致不一致。
請在下面找到詳細資訊。
我的範例 csv 文件:
1|a,b|4 1|c,d|4 1|e,f|4 1|g,h|4 1|i,j|4
我想要最終結果為:
1|"a,b"|4 1|"c,d"|4 1|"e,f"|4 1|"g,h"|4 1|"i,j"|4
添加引號後,我將替換“|” 使用“,”這樣我的 csv 將按預期工作。
我使用了下面的命令,但它沒有像預期的那樣給出。
sed -e 's/,/"&"/' file1.txt
使用
csvformat
fromcsvkit
,並假設最終結果應該是一個以逗號作為分隔符的 CSV 文件(如問題文本中所述):$ csvformat -d '|' file 1,"a,b",4 1,"c,d",4 1,"e,f",4 1,"g,h",4 1,"i,j",4
這會將 CSV 文件的格式從
|
-characters 作為分隔符重新設置為將預設逗號作為分隔符。這樣做時,它會正確引用需要引用的欄位。這也可以正確處理帶有嵌入換行符的欄位:
$ cat file 1|a,b|4 1|c,d|4 1|e,f|4 1|g,h|4 1|i,j|4 2|"line 1, line2"|5
$ csvformat -d '|' file 1,"a,b",4 1,"c,d",4 1,"e,f",4 1,"g,h",4 1,"i,j",4 2,"line 1, line2",5
如果您有某個結構化文件格式的文件,例如 CSV、JSON、XML、YAML、TOML 等,則沒有理由不使用該文件格式的解析器來解析該文件。
你可以這樣做:
awk -F'[|]' -v OFS=',' -v q='"' '{ for(i=1; i<=NF; i++) $i=q $i q }1' infile
我們定義了
-F'[|]'
輸入欄位分隔符。我們定義了
-v OFS=','
輸出欄位分隔符。
NF
根據 FS(輸入欄位分隔符)確定每行/記錄中有多少欄位,因此我們循環遍歷欄位的數量並為每個欄位添加雙引號,並使用awk 的1
習語在行上列印最終更新列印。請注意,所有欄位都被此命令引用,這顯然不是擁有有效 CSV 文件的問題。