2016-11-02 9 views
0

お客様からは、当社のsftpサーバー上にx個のcsvファイルがあります。ファイルは、通常、ヘッダー名、列数、および行数の点で異なります(通常、数千から数百万行の間で、ファイルサイズは350MBを超えません)。現在、カスタムC#スクリプトを使用して、すべてのファイルをssisで処理しています。Linux上でスキーマが変更されているピボット解除ファイル

私が達成したいのはこれです...データフローと前処理時間を短縮するために、プロセス全体をlinux(私たちのsftpサーバ)に移してください。

これは皆さんの多くにとって些細な作業であるかもしれませんが、私はそのカテゴリに属しているとは言いません...実際にLinuxでの経験はありません。

だから、これを行う方法を、任意の実行可能な解決策は

CSVファイルは常に変化するユーザーの列の数を除いて、次のようになります...時間効率、メモリ消費量などに関しては、があります。

たとえば、ファイル名:userdata.csv

Question; user1; user2; user3; user4 
How old are you; 20; 22; 45; 54 
How tall are you; 186; 176; 166; 195 

そして、私はこのようになります後だ出力:

Question; Value; User; Filename 
How old are you; 20; user1; userdata 
How old are you; 22; user2; userdata 
How old are you; 45; user3; userdata 
How old are you; 54; user4; userdata 
How tall are you; 186; user1; userdata 
How tall are you; 176; user2; userdata 
How tall are you; 166; user3; userdata 
How tall are you; 195; user4; userdata 

提案、アドバイス...何でも大歓迎です。

更新:

だけで入力/出力の仕様について詳しく説明する。..

  1. input.csv(アンケートの結果)

    • 2の質問「user1」、「user2」、「user3」、「user4」の4人のユーザーが「あなたは何歳ですか」「どのくらいの高さですか」と答えています。
    • この例では、「user1」 - 「user4」が使用されています。
    • ライブデータでは、ユーザーの実際の名前が使用されます。
    • ユーザー列の数は、アンケートに参加した人数によって異なります。
  2. output.csv

    • ヘッダー行は4つの静的フィールド表示する変化である:質問、値、ユーザとファイル名を。
    • 質問ごとに行を入力ファイルと同じにする代わりに、ユーザーあたりの行が必要です。
    • [ファイル名]列には、入力ファイルの名前を拡張子なしで保持する必要があります。

文字エンコーディングはUTF-8であり、セパレータはセミコロンです。修飾子は使用されません。

+0

あなたは入力(および出力)ファイルの形式_exactly_指定する必要があります。 – martineau

+0

サンプル値から入力値と出力値のマッピングが不明です。 – martineau

答えて

0

ここで少し読んだあと、多くの試行錯誤を経て、私は解決策があるようです。

ファイル名の配列をループし、個々のファイル名をawkスクリプトに渡す予定のbashスクリプトです。

orgFile.sh

#!/bin/sh 

shopt -s nullglob 
fileList=(*.csv) 

for i in "${fileList[@]}"; do 
    awk -v filename="$i" -f newFile.awk $i 
done 

newFile.awk

#!/usr/bin/awk -f 

function fname(file, a, n) 
{ 
    n = split(file, a, ".") 
    return a[1] 
} 

BEGIN{ 
    FS = ";" 
    fn = "done_" filename 
    print "Question;Value;User;ID" > fn 
} 
{ 
    if (NR == 1) 
    { 
     for (i = 1; i <= NF; i++) 
     { 
      headers[i] = $i 
     } 
    } 
    else 
    { 
     for (i = 1 ; i <= NF; i++) 
     { 
      if (i > 1) 
      { 
       print $1 FS $i FS headers[i] FS fname(filename) >> fn 
      } 
     } 
    } 
} 
関連する問題