我有一个类似下面的文本。
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>
答案 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
运行,将所有标签转换为空白的相对间距。