Text-Processing

在特定字元串之間查找並添加引號

  • June 6, 2021

當我使用 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

使用csvformatfrom csvkit,並假設最終結果應該是一個以逗號作為分隔符的 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 文件的問題。

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