【问题标题】:How can I match the header of a .CSV file with dynamic field names如何将 .CSV 文件的标题与动态字段名称匹配
【发布时间】:2014-07-29 15:06:31
【问题描述】:

我希望我之前的问题的这个精简版听起来比以前好得多。我有一个 .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

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

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 值来实现这一点?

【问题讨论】:

  • 您的要求并不完全清楚。从我读过的内容来看,你能不能只用旧的标题替换新的标题,因为列数和数据的位置是一样的?
  • 如果我更换标题,我永远不会知道我正在加载什么数据。我看到一些文件的列顺序每次都不相同。在这种情况下,我的进程不应该从文件中加载任何数据。为此,我不得不依赖文件头和列顺序。
  • 那么解决方案是在每次导入时从标题中识别每一列,并让其中一些列的名称基于日期吗?日期列名可以根据“日期”、“文件名”计算吗?
  • 文件名中没有日期,我不能使用 Sysdate... 有没有办法可以将这些字符与一些通配符匹配?我不确定...
  • 我建议您向我们展示您的数据的缩减版本,有 6 列(比方说)而不是 16 列。还显示一些示例数据,可能来自两个不同的周,每周有 3 条记录,并显示每个输入的所需输出。那么也许我们可以帮助你。目前,问题中的准确信息太少,无关信息太多。

标签: linux csv sed header cat


【解决方案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]+ 并使用退出代码 ($?),我们能够检查标题格式是否正确。

【讨论】:

  • 很抱歉,上述解决方案不适用于我以前版本的问题:( 我编辑了我的问题以使其更清楚,你能检查一下并告诉我该怎么做?
  • @Dhruuv 我可以让sed 遵循这个正则表达式,这样它就只会打印出与格式匹配的行。这意味着它将打印前半部分,然后您可以处理它,但它不会打印后半部分,因此无法处理。
  • 非常感谢您提供正则表达式解决方案并将我介绍给 regex101。这是非常有帮助和深刻的。如果文件标题与标准标题匹配,则这些列下的数据将是正确的。我不必交叉检查数据。但是您的解决方案也提供了额外的检查,这很棒。如何将此正则表达式用作我的外壳的一部分?或者您能帮我解决sed 的问题,它只检查标题并忽略第 7 和第 8 字段中的数字?提前致谢
  • 所以您只想检查字段 1-6 而根本不检查 7 或 8?所以like this
  • 我需要检查所有字段,但(如果可能)忽略第 7 和第 8 字段中的年-周值。我还需要检查 7 和 8,因为这些字段可能会更改它们的顺序。例如,我可以通过忽略年-周或将年-周替换为 XXXXXX 来检查文件的标题与我在上面创建的标准标题的标题,然后检查其余部分以确保字段位于正确的位置。很抱歉给您带来了麻烦,但我真的希望您能理解我的问题。
猜你喜欢
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多