2012-02-06 2 views
0
に大きなテキストファイル

解決しよう:私の良き友人は私のために次のプログラムを書いた:分割列

filename="my_input_file" 
context="channel"    # this is the key which separates the blocks in the input file 
desired_column_separator="," # this will separate the columns in the output file 
output_prefix="modified_"  # prefix for the output file 


if [ -d ./tmp ] 
then 

echo " " 
echo "***WARNING***" 
echo "I want to use and delete a ./tmp/ directory, but one already exists... please remove/rename it, or alter my code***" 
echo " " 
exit 
fi 


mkdir ./tmp 
cd ./tmp 

csplit -z -n 4 ../$filename /$context/ {*} 1> /dev/null 

filenum=`ls -1 ./ | wc -l` 
limit=`echo "$filenum - 1" | bc -l` 
lines=`wc -l < xx0000` 

touch tmp.dat 


     for j in `seq 1 $lines` 
     do 

    oldstring='' 

       for i in `seq 0 $limit` 
       do 

       inputNo=`printf "%04d" $i` 
       string=`head -n $j 'xx'$inputNo | tail -n 1` 

     oldstring=$oldstring$string$desired_column_separator 

       done 

     finalstring=`echo $oldstring | tr -d '\r' | tr -d '\n'` 

     echo "working on line "$j" out of "$lines 
       echo -n $finalstring >> tmp.dat     
       echo -e "\r" >> tmp.dat 

     done 

mv tmp.dat ../$output_prefix$filename 
cd .. 
rm -r -f ./tmp/ 

echo "...done!" 

オリジナル:私はこのフォーラムの死に行われてきた分割テキストファイルを知っているが、私はcouldn私の問題に固有の方法を見つけることができません。 大きなファイル(> 200MB)をテキスト行の列に分割したいが、 'split'関数はすべての列をそれ自身のファイルに入れる。 3,000個の個々のファイルのテキストは、正直言って他のプログラムに読み込む苦痛です。また、データのヘッダ(4行目の最後の部分)として使用するテキストファイルの一部を抽出したいと考えています。

channel names: 
03/02/2012 12:03:03 - TDS3k(CH1) 
start times: 
03/02/2012 12:08:02.311422 
dt: 
0.000000 
data: 
-8.000000E-4 
-8.000000E-4 
-1.600000E-3 
... (9,994 lines omitted) 
-2.400000E-3 
-1.600000E-3 
-2.400000E-3 
channel names: 
03/02/2012 12:03:03 - TDS3k(CH1) 
start times: 
03/02/2012 12:33:11.169533 
dt: 
0.000000 
data: 
-8.000000E-4 
-1.600000E-3 
-1.600000E-3 
... (another 9,997 lines omitted) 

私はそうのように見えるしたいと思います:

channel names:      channel names: 
03/02/2012 12:03:03 - TDS3k(CH1) 03/02/2012 12:03:03 - TDS3k(CH1) 
start times:      start times: 
03/02/2012 12:08:02.311422   03/02/2012 12:33:11.169533 
dt:        dt: 
0.000000       0.000000 
data:        data: 
-8.000000E-4      -8.000000E-4 ... 
-8.000000E-4      -1.600000E-3 ... 
-1.600000E-3      -1.600000E-3 ... 
...        ... 

私が正しい場所にスプリットを得ることがより行うことが容易である疑いがある 初期ファイルはそうのように、単一の列で構成されていヘッダーが、私はどちらかを行うのに十分ではありません。事前に

おかげで

編集:私はまだ特定の言語を使用していませんよ。私はRでそれを分析することができる形式でデータを必要とします。私は、皆さんが働くことが示唆できるものは何でも一緒に行きます。

+1

どのようなプログラミング言語を使用しますか? – ChrisWue

+0

あなたが知っているのは、あなたが使っているツール(言語/スプレッドシート/データベース/その他)についてちょっとしたヒントを与えたいかもしれません。 –

+0

私は特定の言語を使用していません。 「sed」と「awk」はどちらも友人によって示唆されていましたが、私はそれらを働かせることができませんでした。私はある時点でそれをRにロードします。 – user1191276

答えて

0

あなたはどの言語を使用していますか?エントリごとにいくつの「データ」エントリがありますか?

Pythonを使用すると、データを「エントリ」に分割し、各エントリの解析関数を作成して、最終出力に表示する値のみを生成するのが最も簡単な方法です。その後、単純に最終出力を結合するか、csvモジュールを使用して書き込みます。

input = """channel names: 
03/02/2012 12:03:03 - TDS3k(CH1) 
start times: 
03/02/2012 12:33:11.169533 
dt: 
0.000000 
data: 
-8.000000E-4 
-1.600000E-3 
-1.600000E-3 
channel names: 
03/02/2012 12:03:03 - TDS3k(CH1) 
start times: 
03/02/2012 12:33:11.169533 
dt: 
0.000000 
data: 
-8.000000E-4 
-1.600000E-3 
-1.600000E-3 
""" 

LINES_PER_ENTRY = 10 

def parseEntry(entry): 
    return entry 

raw = input.split('\n') 

entries = [raw[i*LINES_PER_ENTRY:(i+1)*LINES_PER_ENTRY] for i in range(len(raw)/10)] 


parsed_entries = [parseEntry(entry) for entry in entries] 

outfile = open('outfile.txt','w') 
for parsed_entry in parsed_entries: 
    outfile.write('\t'.join(parsed_entry) + "\n") 
print parsed_entries 
+0

私はRを使って分析をしようとしていますが、最初にデータを適切な形式にする必要があります。私はどんな言語でも動作します。友人は「sed」と「awk」を提案しましたが、私はどちらかを働かせることができませんでした。 これは、データを1つのファイルの列として出力しますか?出力列(テキストとヘッダーを含む)あたりの行の総数は10007である必要がありますが、それは可変である可能性があるため、固定エントリの長さを使用するのは危険です。ご協力いただきありがとうございます。明日は私が目が覚めるとPythonを見ていきます。 また、「5分編集」のことは何ですか?それは本当に面倒です。 – user1191276

+0

その場合、解析したいもののより大きな例を提供できますか? –

+0

あなたが欲しいのですが、私はそれが何をするかはわかりません。たぶん私はそれを少し良く説明することができます: 私のデータは、1つの列に複数の「インスタンス」で構成されています。それぞれの「インスタンス」は、7行のテキスト(opに示されている)と、それに続く10,000行の数字で構成されています。 「インスタンス」は連結されています。 – user1191276