如何格式化不是分隔符分隔值的文件?

时间:2017-04-11 15:57:55

标签: python bash pandas awk sed

我有一个类似下面的文本。

myStream.on('error', reject)

如果输入不是csv,tsv或空格分隔,我如何将值和标题放入列中?

我试过sed,awk,Pandas,没有结果。 不同列之间没有常规模式

我想要一个像这样的文件:

  {
     FileStream fs = new FileStream(configFile, FileMode.Open);
     XDocument xD = XDocument.Load(fs);
     XElement root = xD.Element("Store");
     root.Add(
          new XElement("template", new XElement("filePath", tmp.TempPath),
          new XElement("Name", tmp.TempName),
          new XElement("description", tmp.TempDesc)));
     xD.Save(fs);
     fs.Flush();
     fs.Dispose();
 }

UPDATE 将它转换为csv显然很棒,但考虑到缺少的字段。

<?xml version="1.0" encoding="utf-8"?>
<Store>
  <template>
    <filePath>.\templates\balls.html</filePath>
    <Name>Balls</Name>
    <description>Benoit</description>
  </template>
</Store><?xml version="1.0" encoding="utf-8"?>
<Store>
  <template>
    <filePath>.\templates\balls.html</filePath>
    <Name>Balls</Name>
    <description>Benoit</description>
  </template>
  <template>
    <filePath>.\templates\benoit.html</filePath>
    <Name>benoit</Name>
    <description>balls</description>
  </template>
</Store>

4 个答案:

答案 0 :(得分:0)

试试这个:

echo "DATE,HOUR,LCU_NUMBER,MVS_SYSTEM_ID,ACTIVE_RATE" > out.csv
tail -n+4 file.txt | awk 'BEGIN{OFS=","}{print $1,$2,$3,$4,$5}' >> out.csv

答案 1 :(得分:0)

如果您可以手动添加第2行和第3行,请使用以下 -

$ awk '(NR==1 || NR > 3) {printf "%-32s %-10s %-6s %-18s %-10s\n", $1,$2,$3,$4,$5}' file
DATE                             HOUR       LCU    MVS                ACTIVE
2017-04-03                       0          004D   PROD               12.15
2017-04-03                       0          005F   PROD               9.82
2017-04-03                       0          0060   PROD               5.99

答案 2 :(得分:0)

熊猫解决方案

您的文件似乎是固定宽度格式的文件,因此我们可以使用Pandas.read_fwf()方法:

import pandas as pd

pd.read_fwf('/path/to/input_file.txt').to_csv('c:/temp/out.csv', index=False)

结果('c:/temp/out.csv'):

DATE,HOUR,LCU,MVS,ACTIVE
,,NUMBER,SYSTEM,RATE
,,,ID,
2017-04-03,0.0,004D,PROD,12.15
2017-04-03,0.0,005F,PROD,9.82
2017-04-03,0.0,0060,PROD,5.99

答案 3 :(得分:0)

您的数据使用固定宽度字段,在GNU awk中处理它的方法只是指定FIELDWIDTHS变量中每个字段的宽度:

$ cat tst.awk
BEGIN { FIELDWIDTHS="12 21 16 9 21"; OFS="," }
{
    for (i=1;i<=NF;i++) {
        gsub(/^\s+|\s+$/,"",$i)
        printf "%s%s", $i, (i<NF ? OFS : ORS)
    }
}

$ awk -f tst.awk file
DATE,HOUR,LCU,MVS,ACTIVE
,,NUMBER,SYSTEM,RATE
,,,ID,
2017-04-03,0,004D,PROD,12.15
2017-04-03,0,005F,PROD,9.82
2017-04-03,0,0060,PROD,5.99

这会创建更多有用的CSV标头:

$ cat tst.awk
BEGIN { FIELDWIDTHS="12 21 16 9 21"; OFS="," }
/[0-9]/ {
    if ( !inData++ ) {
        for (i=1;i<=NF;i++) {
            printf "%s%s", hdr[i], (i<NF ? OFS : ORS)
        }
    }
    for (i=1;i<=NF;i++) {
        gsub(/^\s+|\s+$/,"",$i)
        printf "%s%s", $i, (i<NF ? OFS : ORS)
    }
    next
}
{
    for (i=1;i<=NF;i++) {
        gsub(/^\s+|\s+$/,"",$i)
        if ($i != "") {
            hdr[i] = (i in hdr ? hdr[i] "_" : "") $i
        }
    }
}

$ awk -f tst.awk file
DATE,HOUR,LCU_NUMBER,MVS_SYSTEM_ID,ACTIVE_RATE
2017-04-03,0,004D,PROD,12.15
2017-04-03,0,005F,PROD,9.82
2017-04-03,0,0060,PROD,5.99

如果您的输入实际上混合了空白字符和标签,请先通过pr -e -t运行,将所有标签转换为空白的相对间距。