2017-04-11 83 views
2

我有一個像下面這樣的文本文件。如何格式化不以分隔符分隔的值文件?

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,熊貓,沒有結果。 不同的列

之間沒有常客模式,我想這樣的一個文件:

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 

UPDATE 這將是巨大的顯然將其改造成一個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 
+0

它是空格和製表符的混合嗎? –

+0

這個文件是什麼?它來自哪裏?它被某些東西分隔,否則它將是一個沒有格式的連續字符串。 2017-04-030004DPROD12.15 2017-04-030005FPROD9.82 2017-04-0300060PROD5.99 根據來連接這個工作,它的空間分隔的......除非你剛剛輸入其送到看起來像輸出。 – Stese

+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 
+0

它可以工作,但我不能回顯你的第一行 –

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 
+0

我不能,不幸的是它來自一個SQL查詢,我有隻是我寫的形式的輸出 –

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 
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將所有制表符轉換爲空白相對間距。