2017-04-11 4 views
2

私は次のような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を試しましたが、結果はありません。 異なる列

間には常連のパターンは、私はこの1つのようなファイルが好きないだろう: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 

UPDATEを、しかし、考慮不足している分野を考慮します。

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まで実行して、すべてのタブをブランクの相対的な間隔に変換します。

関連する問題