18

一連のテキストファイルを解析し、Python(2.7.3)を使用してCSVファイルとして保存しようとしています。すべてのテキストファイルには4行の長さのヘッダーがあり、これを取り除く必要があります。データ行には、「(引用符)」、「-(ダッシュ)」、「:列」、空白などのさまざまな区切り文字があります。これらすべての異なる区切り文字を使用してC ++でコーディングするのは面倒なので、Pythonで試してみることにしました。 C /C++に比べて比較的簡単に実行できます。

1行のデータでテストするためのコードを作成しましたが、実際のファイルで機能させることはできませんでした。1行を解析するために、テキストオブジェクトと「replace」メソッドを使用していました。私の現在の実装はテキストファイルをリストとして読み取るようで、リストオブジェクトのreplaceメソッドはありません。

Pythonの初心者なので、この時点で行き詰まりました。任意の入力をいただければ幸いです!

ありがとう!

# function for parsing the data
def data_parser(text, dic):
for i, j in dic.iteritems():
    text = text.replace(i,j)
return text

# open input/output files

inputfile = open('test.dat')
outputfile = open('test.csv', 'w')

my_text = inputfile.readlines()[4:] #reads to whole text file, skipping first 4 lines


# sample text string, just for demonstration to let you know how the data looks like
# my_text = '"2012-06-23 03:09:13.23",4323584,-1.911224,-0.4657288,-0.1166382,-0.24823,0.256485,"NAN",-0.3489428,-0.130449,-0.2440527,-0.2942413,0.04944348,0.4337797,-1.105218,-1.201882,-0.5962594,-0.586636'

# dictionary definition 0-, 1- etc. are there to parse the date block delimited with dashes, and make sure the negative numbers are not effected
reps = {'"NAN"':'NAN', '"':'', '0-':'0,','1-':'1,','2-':'2,','3-':'3,','4-':'4,','5-':'5,','6-':'6,','7-':'7,','8-':'8,','9-':'9,', ' ':',', ':':',' }

txt = data_parser(my_text, reps)
outputfile.writelines(txt)

inputfile.close()
outputfile.close()
4

3 に答える 3

18

ループを使用forして、テキストファイルの行を繰り返し処理します。

for line in my_text:
    outputfile.writelines(data_parser(line, reps))

スクリプトの開始時にすべてをロードするのではなく、ファイルを1行ずつ読み取りたい場合は、次のようにすることができます。

inputfile = open('test.dat')
outputfile = open('test.csv', 'w')

# sample text string, just for demonstration to let you know how the data looks like
# my_text = '"2012-06-23 03:09:13.23",4323584,-1.911224,-0.4657288,-0.1166382,-0.24823,0.256485,"NAN",-0.3489428,-0.130449,-0.2440527,-0.2942413,0.04944348,0.4337797,-1.105218,-1.201882,-0.5962594,-0.586636'

# dictionary definition 0-, 1- etc. are there to parse the date block delimited with dashes, and make sure the negative numbers are not effected
reps = {'"NAN"':'NAN', '"':'', '0-':'0,','1-':'1,','2-':'2,','3-':'3,','4-':'4,','5-':'5,','6-':'6,','7-':'7,','8-':'8,','9-':'9,', ' ':',', ':':',' }

for i in range(4): inputfile.next() # skip first four lines
for line in inputfile:
    outputfile.writelines(data_parser(line, reps))

inputfile.close()
outputfile.close()
于 2012-08-13T15:03:49.850 に答える
11

受け入れられた答えから、あなたの望ましい行動は

skip 0
skip 1
skip 2
skip 3
"2012-06-23 03:09:13.23",4323584,-1.911224,-0.4657288,-0.1166382,-0.24823,0.256485,"NAN",-0.3489428,-0.130449,-0.2440527,-0.2942413,0.04944348,0.4337797,-1.105218,-1.201882,-0.5962594,-0.586636

の中へ

2012,06,23,03,09,13.23,4323584,-1.911224,-0.4657288,-0.1166382,-0.24823,0.256485,NAN,-0.3489428,-0.130449,-0.2440527,-0.2942413,0.04944348,0.4337797,-1.105218,-1.201882,-0.5962594,-0.586636

もしそうなら、私は次のようなことを考えます

import csv

with open("test.dat", "rb") as infile, open("test.csv", "wb") as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile, quoting=False)
    for i, line in enumerate(reader):
        if i < 4: continue
        date = line[0].split()
        day = date[0].split('-')
        time = date[1].split(':')
        newline = day + time + line[1:]
        writer.writerow(newline)

ものより少し簡単になりrepsます。

于 2012-08-13T15:24:40.987 に答える
2

これにはいくつかの方法があります。inputfile.read()代わりに-を使用する 1 つのオプションがありますinputfile.readlines()- 最初の 4 行を削除するには別のコードを記述する必要がありますが、最終的な出力を単一の文字列として残したい場合は、これが最も理にかなっています。

2 番目のより簡単なオプションは、最初の 4 行をmy_text = ''.join(my_text). これは少し非効率的ですが、速度が大きな問題でなければ、コードは最も単純になります。

最後に、実際に単一の文字列ではなく文字列のリストとして出力が必要な場合は、データ パーサーを変更してリストを反復処理するだけです。それは次のようになります。

def data_parser(lines, dic):
    for i, j in dic.iteritems():
        for (k, line) in enumerate(lines):
            lines[k] = line.replace(i, j)
    return lines
于 2012-08-13T15:11:08.527 に答える