如何使可变的非定界文件成为定界文件

时间:2018-07-29 15:05:12

标签: delimiter text-parsing

大家好,我想将我的非分隔文件转换为分隔文件 该文件的示例如下。

0,5

以此类推,所有数据都采用这种格式。 前三行是元数据,然后是数据。 如何使用逻辑将其定界为正确的格式。

1 个答案:

答案 0 :(得分:0)

问题有两个部分:

  • 如何查找列宽
  • 如何将每行拆分为多个字段并使用定界符输出新行

我无法为第一个解决方案提出自动解决方案,因为(不了解有关元数据格式的任何信息),没有明确的方法可以找到一列在哪里结束而下一列在哪里开始。某些列标题包含多个以空格分隔的单词,并且空格也用作标题之间的分隔符(显然,不能使用以下规则:“一个以上的空格表示标题名称的末尾”,因为“之间只有一个空格”地址行2”和“国家/地区”-它们显然是分开的列。显然,找到正确的列宽需要理解英语,而这不是您可以编写程序的目的。

对于第二个问题,事情变得容易得多-一旦有了列的位置。如果您手动计算列位置(或以编程方式,如果您知道一些我不了解的元数据,并且您有一种简单的方法来查找列标题),那么用AWK编写的程序就可以做到这一点:

cols="8,15,32,40,53,66,83,105"
awk_prog='BEGIN {
nt=split(cols,tabs,",")
delim=","
ORS=""
}
{ o=1 ;
  for (i in tabs) { t=tabs[i] ; f=substr($0,o,t-o); sub(" *$","",f) ; print f 
delim ; o=t } ;
  print substr($0, o) "\n"
}'
awk -v cols="$cols" "$awk_prog" input_file

请注意,当数据中出现分隔符(例如“,”)时,上述程序无法正确处理。如果决定原样使用此输入,请确保使用输入数据中不存在的分隔符。最好修改代码以转义在输入数据中找到的任何分隔符(有不同的方法,具体取决于您打算将输出文件提供给什么)。