Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何格式化非分隔符分隔值文件?_Python_Bash_Pandas_Awk_Sed - Fatal编程技术网

Python 如何格式化非分隔符分隔值文件?

Python 如何格式化非分隔符分隔值文件?,python,bash,pandas,awk,sed,Python,Bash,Pandas,Awk,Sed,我有一个类似下面的txt DATE HOUR LCU MVS ACTIVE NUMBER SYSTEM RATE ID

我有一个类似下面的txt

  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