2017-08-03 105 views
-1

我有一個CSV文件,在這個CSV文件中有一些列的缺失條目。如果沒有設置列,我想添加一個空值。不完整的CSV文件(缺少列)

這裏是CSV文件的結構:

ID; LON; LAT;圖像;歷史;地址;文本;類型;名稱;網絡; DATE_OF_BIRTH; date_of_death; START_DATE

一個完整的數據行看起來是這樣的:

n3329319394; 4.369872; 50.866430;歷史紀念=;像=文件:Schaerbeek_40_rue_Vondel_Les_pavés_de_la_mémoire.jpg;紀念:地址= 40, 茹ë馮德爾 - Vondelstraat,斯哈爾貝克;紀念:文本= ICI habitait 伊麗莎白Orcher-Karolinski NEE 1912抗線arrêtée1942年8月15日 拘禁Malines被驅逐1942年8月18日奧斯威辛assassinée 1942年8月20日;紀念:類型=絆腳石;名稱=伊麗莎白Orcher- Karolinski;網絡=絆腳石 布魯塞爾;負責人:DATE_OF_BIRTH = 1912-00-00;負責人:date_of_death = 1942年8月20日

但不時數據行看起來是這樣的:

n4208925477; 5.041860; 52.141352;歷史紀念碑=紀念館;紀念館:addr =蘭格拉赫特 27; memorial = type = stolperstein; name = Lucas & Clara IJzerman

任何想法如何輕鬆地轉換此數據?一個很好的提示可能是限定詞: 「形象= ...」 等

感謝, 比約恩·

回答

0

[投訴]

  • 你沒有提供你自己的努力。
  • 您對問題的描述不準確。

[投訴關閉]

但是你提出我的好奇心。因此,我試圖解決它。 (特別是提的示例數據Stolperstein –很聰明現在,我感覺像一個「使命是幫助好人」 ......)


我簡化你的問題有點:

  1. 我假設領域idlonlat是強制性的。

  2. 我認爲可選的命名字段爲name,historicimage

我的測試數據test-complete-lines.txt

n3329319394;4.369872;50.866430;name=Klaus Mustermann;historic=memorial;image=j.doe-de.png 
n3329319395;4.369872;50.866430;name=Gabi Mustermann 
n4208925477;5.041860;52.141352;historic=memorial 
n4208925477;5.041860;52.141352;image=the-image.png 
n3329319395;4.369872;50.866430;name=Gabi Mustermann;historic=memorial 
n3329319395;4.369872;50.866430;name=Gabi Mustermann;image=j.doe.female-de.png 

我的腳本test-complete-lines.awk

BEGIN { FS=";" } 
# get mandatory fields id, lon, lat 
{ id = $1 ; lon = $2 ; lat = $3 } 
# set optional fields empty 
{ name=";name=" ; historic=";historic=" ; image=";image=" } 
# replace found fields with values 
/;name=/ { name = gensub(/^.*(;name=[^;]*).*$/, "\\1", "g", $0) } 
/;historic=/ { historic = gensub(/^.*(;historic=[^;]*).*$/, "\\1", "g", $0) } 
/;image=/ { image = gensub(/^.*(;image=[^;]*).*$/, "\\1", "g", $0) } 
# print processed line 
{ print id";"lon";"lat""name""historic""image } 

測試與GAWK(bash中,Cygwin的時,Windows 10(64位)):

$ awk --version 
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.5-p10, GNU MP 6.1.2) 
Copyright (C) 1989, 1991-2016 Free Software Foundation. 

$ awk -f test-complete-lines.awk <test-complete-lines.txt 
n3329319394;4.369872;50.866430;name=Klaus Mustermann;historic=memorial;image=j.doe-de.png 
n3329319395;4.369872;50.866430;name=Gabi Mustermann;historic=;image= 
n4208925477;5.041860;52.141352;name=;historic=memorial;image= 
n4208925477;5.041860;52.141352;name=;historic=;image=the-image.png 
n3329319395;4.369872;50.866430;name=Gabi Mustermann;historic=memorial;image= 
n3329319395;4.369872;50.866430;name=Gabi Mustermann;historic=;image=j.doe.female-de.png 

$ 

備註:

  1. 替換找到的字段假定沒有;將出現在內容中。我建議你做一個計數器樣本(其中;出現在內容中)。這可能會激活某種引用或轉義。因此,可能需要額外處理這種情況。

  2. 我只提到了一些命名的字段。您必須在計劃後添加其餘部分。

  3. Btw。我的示例文本中意外地出現了一行空行。這產生:
    ;;;name=;historic=;image=
    如果需要處理空行,另一個規則可能會(後BEGIN { })插入:
    /^[ \t]*$/ { skip }

  4. 在我的第一個版本,我在樣本數據–一個被遺忘的;一個錯字。因此,image=成爲name=的內容,但也被確認爲個別領域。假設命名字段可能不會作爲第一個字段出現,我將其包括前面的;修正爲字段名稱的模式。