如何在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和 如果某个项目如何保留订单,例如电话号码没有给出?
非常感谢提前。
答案 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