1

データのテキスト ファイルで 3 つのコンマを 1 つのコンマに置き換えるのに問題があります。

データベースを使用してクエリできるように、大きなテキスト ファイルを処理してコンマ区切り形式にしています。

コマンドプロンプトで次のことを行い、動作します:

  >>> import re
  >>> line = 'one,,,two'
  >>> line=re.sub(',+',',',line)
  >>> print line
  one,two
  >>>

以下は私の実際のコードです:

  with open("dmis8.txt", "r") as ifp:
      with open("dmis7.txt", "w") as ofp:
          for line in ifp:
              #join lines by removing a line ending.
              line=re.sub('(?m)(MM/ANGDEC)[\r\n]+$','',line)
              #various replacements of text with nothing. This removes the text
              line=re.sub('IDENTIFIER','',line)
              line=re.sub('PART','50-1437',line)
              line=re.sub('Eval','',line)
              line=re.sub('Feat','',line)
              line=re.sub('=','',line)
              #line=re.sub('r"++++"','',line)
              line=re.sub('r"----|"',' ',line)
              line=re.sub('Nom','',line)
              line=re.sub('Act',' ',line)
              line=re.sub('Dev','',line)
              line=re.sub('LwTol','',line)
              line=re.sub('UpTol','',line)
              line=re.sub(':','',line)
              line=re.sub('(?m)(Trend)[\r\n]*$',' ',line)
              #Remove spaces replace with semicolon
              line=re.sub('[ \v\t\f]+', ',', line)
              #no worky line=re.sub(r",,,",',',line)
              line=re.sub(',+',',',line)
              #line=line.replace(",+", ",")
              #line=line.replace(",,,", ",")
              ofp.write(line)

これは、上記のコードから得られるものです。複数のコンマが一緒になっています。1 つのコンマに置き換えられない理由がわかりません。そもそも余分なコンマがどのようにそこにあるのかわからないことは気にしないでください。

  50-1437,d
  2012/05/01
  00/08/27
  232_PD_1_DIA,PED_HL1_CR,,,12.482,12.478,-0.004,-0.021,0.020,----|++++
  232_PD_2_DIA_TOP,PED_HL2_TOP,,12.482,12.483,0.001,-0.021,0.020,----|++++
  232_PD_2_DIA,PED_HL2_CR,,12.482,12.477,-0.005,-0.021,0.020,----|++++
  232_PD_2_DIA_BOT,PED_HL2_BOT,,12.482,12.470,-0.012,-0.021,0.020,--|--++++

参照用の生データ:

  PART IDENTIFIER         :  d
  2012/05/01
  00/08/27
  232_PD_1_DIA  Eval Feat =  PED_HL1_CR   MM/ANGDEC
                    Nom           Act           Dev         LwTol         UpTol         Trend
                 12.482        12.478        -0.004        -0.021         0.020     ----|++++

  232_PD_2_DIA_TOP  Eval Feat =  PED_HL2_TOP   MM/ANGDEC
                 12.482        12.483         0.001        -0.021         0.020     ----|++++

  232_PD_2_DIA  Eval Feat =  PED_HL2_CR   MM/ANGDEC
                 12.482        12.477        -0.005        -0.021         0.020     ----|++++

誰かが私が間違っていることを親切に指摘できますか?

前もって感謝します...

4

2 に答える 2

2

あなたの正規表現は正常に機能しています。問題は、正規表現でそれらをスクラブした後、write() (それらを ing して)行を連結することです。

代わりに、"".join()すべての行で使用しre.sub()、全体で実行してwrite()から、すべてを一度にファイルに書き込みます。

于 2012-06-09T03:50:49.230 に答える
0

あなたの問題は、行末を削除しても行に参加しないという事実と、write各文字列の最後に改行を追加しないという事実が原因であると思います。したがって、出力では単一の行のように見える複数の入力行があります。

コメントを見ると、行末を空の文字列に置き換えるだけで魔法のように次の行が追加されると思うようですが、実際には機能しません。したがって、表示されている 3 つのコンマはre.subコマンドによって置き換えられません。それらは 1 行に含まれていないためです。これらは複数の入力行 (コンマを除いてすべての置換は空です) であり、単一の出力行に出力されるためです。'\n'文字を削除し、書き込まれた各文字列の末尾にwrite自動的に追加されません'\n'( とは異なりますprint)。

コードをデバッグするにprint lineは、コードの各行の後に置くだけで、各「行」が実際に何であるかを確認できます。これは、何が問題なのかを確認するのに役立ちます。

for line in file一般に、各「レコード」が複数行にまたがるファイル形式を読み取るには、単なるループよりも複雑な方法が必要です。

于 2012-06-09T03:49:26.583 に答える