簡體   English   中英

如何使用bash腳本將txt文件准備為csv?

[英]How to prepare a txt file to csv using bash script?

如何在bash中准備給定的txt文件以進行csv導入? 給定的結構是這樣的:

Salutation
Name
Surname
Telephone
E-Mail
Street
City
Gender
Employment
Income
*****
Salutation
Name
Surname
Telephone
E-Mail
Street
City
Gender
Employment
Income
*****
Salutation
Name
Surname
E-Mail
Street
City
Gender
Employment
Income
*****

如您所見,第二條記錄沒有電子郵件地址。 沒有給定值的任何其他變化也是可能的。 逐行給出值,記錄由五顆星分隔。

我嘗試使用awk和grep以便將記錄寫入到單獨的文件中以進行csv導入。 如何將給定的記錄乘法行放在csv的一行中,如果沒有提供電話號碼等項目,如何保持順序?

提前謝謝了。

通常,.csv文件具有固定的記錄-並且未包括的字段保留為空。 因此,您的第一個示例可能是:

"Mr","John","Smith","555-1212","jsmith@foo","1 St","New York","M","CSV Wrangler","5"

您的第二個可能是:

"Mrs","Mary","Brown",,"mbrown@foo","5 St","Ottawa","F","CSV Wrangler","5"

但是,您的輸入文件中無法檢測到缺少哪個字段。 這意味着您將無法可靠地創建.csv文件。 您必須知道字段名稱和字段值才能執行此操作,除非您根據內容推斷字段(“其中包含@符號,因此必須是電子郵件地址”,等等。)即使您有類似以下記錄,也會失敗:

****
Homer
Springfield
****

是名字和姓氏,還是名字和城市? 您無話可說。

為了使問題更清楚:
我確實收到包含大量不需要的東西的電子郵件請求。
因此,我將* .eml文件導出到/ tmp目錄。
我將所需的信息收集到一個名為Input.txt的文件中。
我的代碼如下所示:

 #!/bin/bash touch /tmp/Input.txt OUTFILE=/tmp/Input.txt cat /dev/null > "$OUTFILE" FILES=/tmp/*.eml for f in $FILES do grep 'Salutation :' "$f" | sed 's/^.*: //' | perl -ne 'print "S1 $_"' >> "$OUTFILE" grep 'Surname :' "$f" | sed 's/^.*: //' | perl -ne 'print "S2 $_"' >> "$OUTFILE" grep 'Name :' "$f" | sed 's/^.*: //' | perl -ne 'print "S3 $_"' >> "$OUTFILE" grep 'Telephone :' "$f" | sed 's/^.*: //' | perl -ne 'print "S4 $_"' >> "$OUTFILE" grep 'E-Mail :' "$f" | sed 's/^.*: //' | perl -ne 'print "S5 $_"' >> "$OUTFILE" grep 'Street :' "$f" | sed 's/^.*: //' | perl -ne 'print "S6 $_"' >> "$OUTFILE" grep 'City :' "$f" | sed 's/^.*: //' | perl -ne 'print "S7 $_"' >> "$OUTFILE" grep 'Date :' "$f" | sed 's/^.*: //' | perl -ne 'print "S8 $_"' >> "$OUTFILE" grep 'Size :' "$f" | sed 's/^.*: //' | perl -ne 'print "S9 $_"' >> "$OUTFILE" grep 'Animals :' "$f" | sed 's/^.*: //' | perl -ne 'print "S10 $_"' >> "$OUTFILE" grep 'Employment :' "$f" | sed 's/^.*: //' | perl -ne 'print "S11 $_"' >> "$OUTFILE" grep 'Income :' "$f" | sed 's/^.*: //' | perl -ne 'print "S12 $_"' >> "$OUTFILE" echo "*****" >> "$OUTFILE" done 

最后,我得到這樣的OUTFILE Input.txt:

S1先生
S2約翰
S3史密斯
S4 1514009855
S5 john.smith@gmail.com
S6榆樹街
S7丹佛
S8 2016年5月21日
S9 66
S10貓
S11軍官
S12 20
*****
S1夫人
S2瑪麗
S3木
S4 65223457
S5 mary.wood@gmail.com
S6塔夫脫大街60號
S7波士頓
S8 2016年4月26日
S10狗
S11秘書
S12 10
*****
S1夫人
S2洛里
S3白
S4 56325478
S6 730維斯塔德爾普拉亞
S7阿納海姆
S8 2016年1月22日
S10魚
S11老師
S12 80
*****


因此,第一條記錄是完整的S1到S12。
在第二個記錄中缺少S9,而在第三個記錄中缺少S5和S9。
目的是要從Input.txt中讀取這些記錄,並將它們放入一個csv文件中。
考慮到缺少的項目,csv應該如下所示:
稱呼,姓氏,名稱,電話,電子郵件,街道,城市,日期,大小,動物,就業,收入
Mr; John; Smith; 1514009855; john.smith@gmail.com; 11ElmStreet; Denver; 05/21/2016; 66; Cat; Officer; 20
夫人;瑪麗;伍德; 65223457; mary.wood@gmail.com; 60塔夫特大道;波士頓; 04/26/2016 ;;狗;秘書; 10
夫人;洛瑞;懷特; 56325478 ;; 730VistadelPlaya;阿納海姆; 2016年1月22日;;魚;老師; 80

暫無
暫無

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

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