2016-07-18 3 views
1

フラットファイルから一部のデータを読み込み、Pythonを使用して他のアプリケーションに表示しようとしています。私のフラットファイルは12,000行あり、私はすべてのデータを必要としません。私はいくつかのデータを解析する必要があります。フラットファイルには12,000行しかありません。行のチャンクは他のデータの他に00を持ち、他のチャンクはその行の他のデータの他に10を持っています。私がしたいのは、10行をすべて解析し、00の行だけを含むことです。フラットファイルからデータをパーズする

以下は、更新されたサンプルファイルです。私は10ですべての行を解析したい。また、ちょうどそのサンプル、私の実際のフラットファイルは12,000行です。

私のフラットファイルを更新しました。ここでは、始めに$を、最後に$と00の後にLOBをつけて、&の前に行を読みたいとします。私は、フラットファイルの他のすべてを解析したい。以下は

$90TM020516 19002200& 
$90LOB 0 0 0 7 10 & 
$90LOB 25 0 0 6 10 & 
$90LOB 57 0 0 6 10 & 
$90LOB353 0 0 5 10 & 
$90LOB 36 0 0 5 10 & 
$90GPSA8 0 38281168 -77448376& 
$90LOB276 0 0 5 10 & 
$90LOB185 0 0 6 10 & 
$90LOB197 0 0 6 00 & 
$90LOB198 0 254 6 00 & 
$90LOB197 0 254 6 00 & 
RSSI $90LOB201 0 254 5 00 & 
$90TM020516 19002300& 
$90LOB194 0 254 5 00 & 
$90LOB190 0 254 5 00 & 
$90LOB185 0 254 5 00 & 
$90LOB181 0 254 5 00 & 
$90LOB187 0 254 5 00 & 
$90LOB192 0 254 5 00 & 
$90LOB195 0 254 5 00 & 
$90LOB195 0 254 5 00 & 
$90LOB191 0 254 5 00 & 
$90LOB184 0 254 5 00 & 
$90LOB177 0 254 5 00 & 

は、読み取りデータ

for line in lines: 
     if (line[0] == '$'): 
     if (line[3:6] == 'LOB'): 
      if (line[22:24]=='00'): 

あなたがしたい場合、私はあなたの全体のフラット・ファイルを送ることができるため、私が使用していたコードです。そのファイルからの単なる抽出。

+0

コードレビューが必要な場合は、http://codereview.stackexchange.com/で行うことができます。そうでない場合は、問題を報告してください。 – muratgu

+0

私は初心者のためにあなたの名前が好きです。だから、* Muscles *あなたが無視したいと思っている行の1つと、あなたが残したい行の例を含む、解析しようとしているファイルのサンプルを投稿してください。第二に、あなたがこの作業のために書いたコードを投稿するといいでしょう。 –

答えて

1

私は(と私は私がやることはよく分からない)が正しくあなたの質問を理解していれば、あなたがこのような行を含むファイルがあります:

@45 0 0 5 10 * 
@45 0 0 5 10 * 
@45 0 0 5 10 * 
@45 0 0 6 10 * 
@45 0 0 6 00 * 
@45 0 0 6 00 * 
@45 0 0 6 00 * 
@45 0 0 5 00 * 

を...そしてあなただけの行を読みたいですその00を持っており、ここでは10

を持っているものを無視すると、これを実現するコードのサンプルです:

# List containing all the lines you want to save 
lines_you_want = [] 

# Open the file with 12,000 lines 
with open('some.file', 'rb') as infile: 

    # Check if each line starts with 00 
    for line in infile: 

     # Check if the 15th character is a '0' instead of a '1' 
     if (line[15] == '0'): 
      lines_you_want.append(line) 

# Do something with lines_you_want 

これは、00または10は、内の同じ位置に常にあることを前提としていfi le(文字15と16)と、これらの2つだけがそこにある可能性があること(すなわち、 01,11,12,29などではない)、そうでなければこれを変更する必要があります。

アプリケーションに応じて、リストを作成する代わりに、行を使って何かを行うこともできます。両方の方法で動作します。

私が誤った仮定をした場合、コメントしてください、私は私の答えを編集します。

+0

これが起こる唯一の方法は、行が16文字以上でない場合です。これは可能ですか? –

1
import re 
filename = <path to file> 
lines = [line.strip() for line in open(filename) if re.match(r'^\$.*LOB.*00 &$', line)] 

A regex101 example

正規表現について説明:

^ラインの開始を示します。 リテラル値$は、行の開始直後に来ます。 パーサーがLOBになるまで、任意の量の文字が後に来る可能性があります。 00についても同様です。これらの文字列がない場合、その行の正規表現に対してはtrueを返しません。

だから、最終的な結果は、開始時に$LOB$後と & `です。ファイル内の他のすべてを解析します。

これは、文字列のリストとして格納され、各文字列は行を表します。

ボーナス:あなたのサンプルデータから

$90LOB197 0 0 6 00 & 
$90LOB198 0 254 6 00 & 
$90LOB197 0 254 6 00 & 
$90LOB194 0 254 5 00 & 
$90LOB190 0 254 5 00 & 
$90LOB185 0 254 5 00 & 
$90LOB181 0 254 5 00 & 
$90LOB187 0 254 5 00 & 
$90LOB192 0 254 5 00 & 
$90LOB195 0 254 5 00 & 
$90LOB195 0 254 5 00 & 
$90LOB191 0 254 5 00 & 
$90LOB184 0 254 5 00 & 
$90LOB177 0 254 5 00 & 

import re 
with open("FOO", 'w') as outfile, open('BAR', 'r') as infile: 
    for line in infile: 
     if re.match(r'^\$.*LOB.*00 &$', line): 
      outfile.write(line) 

この利回り: あなたは別のファイルにこれを出力している場合は、これを行うことができます。

+0

Byrce様、私はあなたの投稿を一見して更新し、それに応じてあなたの答えを更新しました。 – Muscles

関連する問題