我想替換每個記錄中的部分資料的分隔符。例如-
echo ' "hi", "how,are,you", "bye"'|sed -nE 's/"([^,]*), ([^,]*), ([^,]*)"/"1; 2;3"/gp'
輸出 -->
"hi","how;are;you","bye"。
因此,我能夠用分號替換資料中的分隔符(本例中為逗號),這也是資料中存在的。 但挑戰在于,在實時情況下,我們不確定分隔符會出現多少次,而且,它也可能出現在多個欄位中。 例如-
"1","2、3、4、5","6","7、8"。
"1","2、4、5","6","7、8、9"。
"1","4,5","6","7,8,9.2"。
所有這些都是有效的記錄。 誰能幫我一下。我們如何寫一個通用的代碼來處理這個問題呢?
uj5u.com熱心網友回復:
假設資料不包含嵌入式雙引號......
示例資料:
$ cat delim.dat
"hi","how,are,you","bye"。
"1","2、3、4、5","6","7、8"。
"1","2、4、5","6","7、8、9"。
"1","4,5","6","7,8,9.2"。
一個awk的想法,我們在偶數欄位中用;替換,:
awk '
開始 { fs=ofs="" "" }
{ for (i=2;i<=NF;i=i 2) gsub(",","; ",$i) }
1
' delim.dat
這就產生了:
"hi","how;are;you","bye"。
"1","2;3;4;5","6","7;8"。
"1","2;4;5","6","7;8;9"。
"1","4;5","6","7;8;9.2"。
uj5u.com熱心網友回復:
當處理任何東西時,除了最微不足道的CSV資料,我更喜歡使用能直接理解格式的東西,而不是用正則運算式來試圖處理像帶引號的欄位。例如(警告:前面是公然的自我宣傳!),我的基于tcl的awk-like utility tawk,我寫它的部分原因是為了使操作CSV檔案更容易:
$ tawk -csv -quoteall '
行{
for {set n 1}. {$n <=$NF} {incr n}. {
set F($n) [string map {, ;} $F($n)] 。
}
列印
}' input.csv
"hi","how;are;you","bye"。
"1","2;3;4;5","6","7;8"。
"1","2;4;5","6","7;8;9"。
"1","4;5","6","7;8;9.2"。
或者使用Text::CSV_XS模塊的perl方式:
$ perl -MText::CSV_XS -e '
my $csv = Text::CSV_XS->new({binary=>1, always_quote=>1}) 。
while (my $row = $csv->getline(*STDIN)) {
tr/,/;/ foreach @$row;
$csv->say(*STDOUT, $row)。
}' < input.csv
"hi","how;are;you","bye"。
"1","2;3;4;5","6","7;8"。
"1","2;4;5","6","7;8;9"。
"1","4;5","6","7;8;9.2".
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/309929.html
標籤:
下一篇:Shopee在apiv2中回傳錯誤:error_auth-沒有權限。請到Shopee賣家中心通過店鋪KYC驗證;怎么做?
