繁体   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