如何使用bash脚本为csv准备txt文件?

时间:2016-11-25 09:49:57

标签: bash csv

如何在bash中为csv导入准备给定的txt文件? 给定的结构是这样的:

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 import的单独文件中。 如何将记录的给定乘法行放在一行中用于csv和 如果某个项目如何保留订单,例如电话号码没有给出?

非常感谢提前。

2 个答案:

答案 0 :(得分:1)

通常.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文件。您需要知道字段名称和字段值才能执行此操作,除非您根据内容推断字段(“这包含@符号,因此必须是电子邮件地址”等)。如果您有如下记录,即使这样也会失败: / p>

****
Homer
Springfield
****

这是名字和姓氏,还是名字和城市?你没办法说出来。

答案 1 :(得分:0)

更清楚地解决问题:
我收到的电子邮件请求包含许多不必要的内容。
所以我将* .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 11 Elm Street
S7 Denver
S8 05/21/2016
S9 66
S10 Cat
S11官员 S12 20
*****
S1太太 S2玛丽 S3 Wood
S4 65223457
S5 mary.wood@gmail.com
S6 60 Taft Ave.
S7波士顿
S8 04/26/2016
S10狗
S11秘书 S12 10
*****
S1太太 S2 Lori
S3白色 S4 56325478
S6 730 Vista del Playa
S7 Anaheim
S8 01/22/2016
S10鱼
S11老师
S12 80
*****


所以第一个记录是S1到S12完成 在第二个记录中有S9缺失,在第三个记录中缺少S5和S9 目的是从Input.txt中读取这些记录并将它们放入csv文件中 考虑到缺少的项目,csv看起来应该是这样的:
称呼,姓氏,姓名,电话,电子邮件,街道,城市,日期,大小,动物,就业,收入
先生,约翰,史密斯; 1514009855; john.smith@gmail.com; 11ElmStreet;丹佛; 2016年5月21日; 66;猫;干事; 20
夫人玛丽·;木材; 65223457; mary.wood@gmail.com; 60TaftAve;波士顿; 2016年4月26日;;犬;秘书; 10
太太;洛瑞;白色; 56325478 ;; 730VistadelPlaya;阿纳海姆; 2016年1月22日;;鱼;教师; 80

相关问题