2016-05-12 11 views
0

私は解析するためにCSVファイルを開いていますが、csvの特定の行のフォーマットが正しくありません。 1以上associatedTixが存在する場合、それは次のようにフォーマットされ(ipaddress有する複数associateTixがあるので)PythonでCSVファイルの書式を修正します

'ipAddress','associatedTix''\n' 
'ipAddress','associatedTix''\n' 
'ipAddress','associatedTix''\n' 
'ipAddress','associatedTix''\n' 
'ipAddress','associatedTix''\n' 

が、CSV内の特定のポイントで:CSV形式は、全体を通して、以下の典型的私は適切な形式でCSVを取得するために何をするつもりだったので何

'ipAddress','associatedTix''\n' 
'ipAddress','associatedTix''\n' 
'ipAddress','associatedTix''\n' 
'associatedTix','associatedTix''\n' 
'associatedTix''\n' 
'ipAddress','associatedTix''\n' 
'ipAddress','associatedTix''\n' 

されました:

for line in inputCsvFile: 
    chunks = line.split(",") 
     if associatedTix in chunks[0]: 
      #go through the following line's after that line until you find an ip address 
      #go one line above the line with the ip address 
      #push that column to the above row, and repeat until you get to the original line3 row with the ip address 

3 commen ted行は私が構文を思いつくのに困っているので、その構文を決定する助けが大いに評価されるでしょう。また、私のロジックが正しいフォーマットにcsvを取得することの確認も同様に評価されます。

+0

をだから、関連する4つのassociatedTixがでipでありますあなたの例? –

+1

私はあなたのファイルがどのように見えるのか疑いがあります。あなたの質問にその一部をコピーして貼り付け、各行を4つのスペースでインデントしてください。ファイルを読むときに後ろに行くのは難しいので、問題を解決するためには、ipaddressとassocicatedTixesを区別できる必要があります。データが実際にどのように見えるのかわからないため、可能かどうかはわかりません。 – martineau

+0

@martineauの場合、ファイルのテキストを変数に格納し、csvファイルの行を '列挙して'前の行を見つけることができます。 @pHorseSpec、私はあなたが何を意味しているのかよく分かりませんが、同様の行が複数重複してしまい、csvファイルが修正されないようです。前と後の例を教えてください。 –

答えて

2

csvは適切に限り、それらが引用されているよう改行してフィールドを処理します。

$ cat t.csv 
136.107.169.150, 
165.246.197.229,"ESCCB ID#: 90Z-009204, 
ESCCB ID#: 90Z-003262, 
ESCCB ID#: 90Z-003011     ESCCB ID#: 90Z-001047" 
155.89.77.11, 
91.195.188.160, 
154.176.191.130, 

...

>>> with open('t.csv') as fp: 
... read = csv.reader(fp) 
... for line in read: 
...  print line 
... 
['136.107.169.150', ''] 
['165.246.197.229', 'ESCCB ID#: 90Z-009204,\nESCCB ID#: 90Z-003262,\nESCCB ID#: 90Z-003011     ESCCB ID#: 90Z-001047'] 
['155.89.77.11', ''] 
['91.195.188.160', ''] 
['154.176.191.130', ''] 

だから、あなたはあなたが持っていると思う問題、あなたが実際にはありません。 2番目のフィールドを後処理してから書き戻すだけです。

1

Ignacioによると、csvモジュールを使用している場合、実際に問題はありません。あなたはそれを使用したくない場合は、これを使用します。これに

with open("inCSV.txt", "r") as f: 
    text = f.read() 
    # Buffer 
    b = "" 
    keep_reading = False 
    for line in text.split("\n"): 
     if "\"" in line: 
      # A bunch of tixs are going to appear! 
      if b == "": 
       # There are more tixs to read 
       b += line 
       # More tixs to come 
       keep_reading = True 
      else: 
       # This is the last tix to read 
       b += line.replace(",", "") 
       # Remove newlines, extra whitespace and commas 
       b = b.translate(None, " ,\n\"") 
       # Add nice looking whitespace 
       b = b.replace("E", " E") 
       b = b.replace(":", ": ") 
       b = b.replace("I", " I") 
       b = b.strip() 
       # Add comma after IP address 
       ip_index = b.find(" ") 
       b = b.replace(b[:ip_index + 1], b[:ip_index] + ",") 
       # No more tixs to read 
       keep_reading = False 

       print b 
       # reset buffer 
       b = "" 
     elif keep_reading: 
      b += line 
     else: 
      print line 

利点をマーティが言ったように、あなたがメモリにファイル全体を保存する必要はありませんされています。

あなたはしかしcsvモジュールを使用する場合は、あなたが少しより多くの操作を行う必要があります:

import csv 
with open("inCSV.txt", "r") as f: 
    text = csv.reader(f) 
    for line in text: 
     # Get associated tix 
     tix = line[1] 
     # Remove newlines, extra whitespace and commas 
     tix = tix.translate(None, " ,\n") 
     # Add nice looking whitespace 
     tix = tix.replace("E", " E") 
     tix = tix.replace(":", ": ") 
     tix = tix.strip() 

     line[1] = tix 
     print line 

両方はあなたを与える:

['248.53.88.234-24', ''] 
['61.15.168.199-24', ''] 
['181.140.27.200', ''] 
['192.128.254.150', ''] 
['8.160.137.156', 'ESCCB ID#: 90Z-007463'] 
['136.107.169.150', ''] 
['165.246.197.229', 'ESCCB ID#: 90Z-009204 ESCCB ID#: 90Z-003262 ESCCB ID#: 90Z-003011 ESCCB ID#: 90Z-001047'] 
['155.89.77.11', ''] 
['91.195.188.160', ''] 
['154.176.191.130', ''] 
['105.98.164.205', ''] 
['245.6.16.92', ''] 
['207.108.19.66', 'ESCCB ID#: 90Z-002345'] 
['84.71.75.211', 'ESCCB ID#: 90Z-008567 ESCCB ID#: 90Z-006765 ESCCB ID#: 90Z-009384ESCCB ID#: 90Z-0ESCCB ID#: 90Z-007465'] 
['33.236.5.19', ''] 
['127.42.160.158', 'ESCCB ID#: 90Z-002939'] 
['94.34.104.184', ''] 
関連する問題