如何将.CSV文件的标头与动态字段名称匹配

时间:2014-07-29 15:06:32

标签: linux csv sed header cat

我希望我之前问题的这个简化版本听起来比以前好多了。我有一个.CSV文件(频率 - 每周),其标题包含两个每周不断变化的列中的年 - 周值。有关实例,请参阅下文。

store nbr,city,state,region,item nbr,category,201420 sales,201420 sold qty
1001,Kansas City,MO,2,30945232,7,$11,1
1003,Kansas City,KS,3,30945742,6,$40,4
2004,New York,NY,6,30995232,11,$72,12
6003,Sacramento,CA,4,3025742,3,$24,6
9003,Cleveland,OH,9,3057432,12,$44,11
6009,Los Angeles,CA,4,3098294,42,$35,7

我必须检查数据是否放在右列下,然后继续将数据加载到datamart中。出于这个原因,我尝试创建一个标准头文件,将其与此文件的标题进行比较,如下所示:

store nbr,city,state,region,item nbr,category,XXXXXX sales,XXXXXX sold qty

如果我的文件(我即将加载)具有上述格式,我的进程应继续加载数据。如果列不在其位置,请按以下说明

store nbr,region,city,state,category,item nbr,201420 sold qty,201420 sales
1001,2,Kansas City,MO,7,30945232,1,$11
1003,3,Kansas City,KS,6,30945742,4,$40
2004,6,New York,NY,11,30995232,12,$72
6003,4,Sacramento,CA,3,3025742,6,$24
9003,9,Cleveland,OH,12,3057432,11,$44
6009,4,Los Angeles,CA,42,3098294,7,$35

然后该过程应该失败。我主要担心的是 - 由于字段7和8的动态特性,我无法每周使用标准标题创建/匹配数据。字段名称中没有日期,我不能使用sysdate(因为我可能必须在第7和第8个字段中使用具有非常旧日期的旧文件)。您能否建议我如何使用 cat/awk/sed 或在标题中使用任何通配符作为Year-week值来实现此目的?

1 个答案:

答案 0 :(得分:1)

如果通过“字段14和15的动态特性”表示周值继续增加1,则应使用一些正则表达式来查找它。

我不确定这是否有效,因为我不知道Column1-13的实际值,但如果使用\d{6},它将匹配6位数的字符串(即YYYYWW)。只要其他Columns不共享此表单,您就可以随时使用该正则表达式获取年周值,然后按照它执行操作。

或者,如果您不想使用正则表达式,则可以使用cut -d, -f14 file.csv | cut -d" " -f1之类的内容打印第14列的年周值,然后将-f14更改为-f15以提供你是第15栏的年 - 周值。

进入聊天室后,我终于明白了OP的确切问题

使用egrep并将年周值替换为[0-9]+并使用退出代码($?),我们可以检查标头是否正确形成或格式错误。< / p>