簡體   English   中英

使用命令行修剪csv文件

[英]Trim csv file using command line

我有非常大的.csv文件,其中包含原始數據。 許多字段具有前導和尾隨空格,並且許多多字符字段值(假定在字符組/單詞之間只有一個空格)具有多余的空格,例如

'12   Anywhere  Street'

應該是:

'12 Anywhere Street'

前導,尾隨和多余的空間從一個額外的空間到六個額外的空間不等。 我可以將文件加載到數據庫中,然后運行腳本來修剪它們。 前導和尾隨的修剪腳本可以很好地運行並且可以快速執行。 但是,用於刪除單詞之間多余空格的腳本要花更長的時間和時間。 最好先使用命令行刪除原始.csv文件中單詞之間的多余空格,然后再將其加載到數據庫中。

我基本上需要運行一個replace函數,將“”的任何實例替換為“”,“”,“”,“ ...”,最多六個空格左右。 我將不勝感激,為實現這一目標提供了一些幫助。

在此響應的第1部分中,我首先假定您的CSV文件具有一個字段分隔符(例如“,”),該分隔符不會出現在任何字段中。 在第2部分中,我將介紹更一般的情況。

第1部分。

awk -F, '
  function trim(s) {
    sub(/^  */,"",s); sub(/  *$/,"",s); gsub(/   */," ",s); return s;
  }
  BEGIN {OFS=FS}
  {for (i=1;i<=NF;i++) { $i=trim($i) }; print }'

第2部分。

要處理一般情況,最好使用CSV感知工具(例如Excel或csv2tsv命令行工具之一)將CSV轉換為簡單的格式,其中值分隔符實際上不會出現在值內。 TSV格式(帶有制表符分隔的值)特別適合,因為它允許將制表符的表示包括在字段中。

然后使用awk -F"\\t"而不是awk -F,運行上述awk命令。

要恢復原始格式,請使用諸如Excel,tsv2csv或jq之類的工具 這是jq咒語,假設您需要“標准” CSV文件:

jq -Rr 'split("\t") | @csv'

在緊要關頭,以下可能就足夠了:

awk -F"\t" '
BEGIN{OFS=","; QQ="\"";}
  function q(s)   { if (index(s,OFS)) { return QQ s QQ }; return s}
  function qq(s)  { gsub( QQ, QQ QQ, s); return QQ s QQ }
  function wrap(s) { if (index(s,QQ)) { return qq(s) } return q(s)}
  { s=wrap($1); for (i=2;i<=NF;i++) {s=s OFS wrap($i)}; print s}'

在MacOS或Linux上,您可以執行以下操作:

cat data.csv | tr -s [:space:] > formatted.csv

這不會修剪每個值,但會刪除所有重復的空格。 也許這會讓你前進。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM