Python 如何格式化非分隔符分隔值文件?
我有一个类似下面的txtPython 如何格式化非分隔符分隔值文件?,python,bash,pandas,awk,sed,Python,Bash,Pandas,Awk,Sed,我有一个类似下面的txt DATE HOUR LCU MVS ACTIVE NUMBER SYSTEM RATE ID
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、tsv或空格分隔的,如何在列中输入值和标题
我试过sed,awk,Pandas,但没有结果。
不同列之间没有常规模式
我想要一个像这样的文件:
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显然是件好事,但要考虑到缺少的字段
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
试试这个:
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
如果可以手动添加第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
熊猫解决方案 您的文件似乎是固定宽度格式的文件,因此我们可以使用以下方法: 结果(
'c:/temp/out.csv'
):
您的数据使用固定宽度字段,在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
$cat tst.awk
开始{FIELDWIDTHS=“12 21 16 9 21”;OFS=“,”}
{
对于(i=1;iIs它是空格和制表符的混合体?这个文件是什么?它来自哪里?它被某些东西分隔,否则它将是一个完全没有格式的连续字符串。2017-04-030004DPROD12.15 2017-04-030005FPROD9.82 2017-04-0300060PROD5.99基于连接这个文件的工作,它是以空格分隔的…除非您刚刚键入它要看起来像输出。标题中有空格和制表符的混合,只有正文中的空格“将值和标题放在列中”是什么意思?@StevenDavison我正在尝试处理它,好像它是一个连续字符串(一行=一个字符串)但是怎么做?!它可以工作,但是我不能像你做的那样回显第一行我不能,不幸的是它来自一个SQL查询,我只有我写的表单的输出
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
$ 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
$ 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