2017-12-07 1 views
1

私は巨大なcsvファイルを別のcsvファイルにコピーしたいが、100行の最初のファイルとretainheaderをスキップすると同時に、引用符で囲まれたいくつかの名前の間にある不要なカンマを無視したい、ロジャー」いくつかの条件で、50000行のヘッダーと別のCSVにCSVファイルをコピーするにはどうすればよいですか?

入力データ:5行目で

Header------> 
EPINASTINE HCL 0.05% EYE DROPS,51991083675,7.75853,03/23/2016,ML 
EPINASTINE HCL 0.05% EYE DROPS,51991083675,7.75853,03/23/2016,ML 
EPINASTINE HCL 0.05% EYE DROPS,51991083675,7.75853,03/23/2016,ML 
HYDROMORPHONE 2 MG TABLET,68084042301,0.08511,03/23/2016,EA 
"BICILLIN L-A 2,400,000 UNITS",60793070210,54.03213,01/01/2016,ML 
EPINASTINE HCL 0.05% EYE DROPS,51991083675,7.75853,03/23/2016,ML 

『BICILLIN LA 2,400,000 UNITS』は一つの要素であり、Iは、スペースによって無視するか交換するかしたいとも先、-間にコンマが含まれてい上位3行を無視します。 output.csvは次のようになります。

Header------> 
    HYDROMORPHONE 2 MG TABLET,68084042301,0.08511,03/23/2016,EA 
    "BICILLIN L-A 2 400 000 UNITS",60793070210,54.03213,01/01/2016,ML 
    EPINASTINE HCL 0.05% EYE DROPS,51991083675,7.75853,03/23/2016,ML 

私を助けてください。以下 は私の抜粋です:

 with open(filename , 'rb') as infile: 
      data_in = infile.readlines() 

     with open ('temp.csv', 'wb') as outfile: 
      outfile.writelines(data_in[0]) 
      outfile.writelines(data_in[3:]) 
     os.remove(filename)  
     os.rename('temp.csv',filename) 

私はこの中で、不要なカンマを交換する方法を取得しておりません。

+0

私はパイソン達ではありませんが、私はCSVファイル(悲しいことに)を使用しています。カンマが含まれているインジケータは、フィールドの二重引用符です。それらの "余分な"カンマを削除する場合は、引用符で囲まれたフィールドに一致する正規表現に注目し、それらのカンマを削除してから、その文字列を使用します(引用符は私の提案です)。ヘッダーを保持し、特定の行を削除する限り、私はイテレータを使用して行のグループをスキップし、レコード処理を行い、ターゲットファイルに追加します。がんばろう。 – DDeMartini

+0

あなたは次のように書いています:1)* 100行目の最初のファイルとretainheader *をスキップします。 2)*上位3行を無視したい*。それで、あなたの実際の正確な条件は何ですか? – RomanPerekhrest

+0

あなたの 'data_in'を行単位でループする必要があり、if文などでスキップ/訂正を行う方法があります。次に、訂正された行をリストに入れてまたは処理されるたびに行ごとに書き込む場合に使用します。 – ahed87

答えて

0

最初の行(ヘッダー)を保持するという面白い要件がありますが、ギャップがあり、さまざまな行にいくつかの正規表現の作業を行うため、行単位でファイルにアクセスする必要があります。あなたのコードは次のようになります:

import os 
filename = "name_of_file.csv" 
with open(filename , 'rb') as infile: 
    with open ('temp.csv', 'wb') as outfile: 
    start_row = 3; 
    row_count = 0; 
    for line in infile.readlines(): 
     if row_count >= start_row: 
     # find all matches for commas inside double quotes 
     regex = b"\".*?,.*?\"" 
     matches = re.findall(regex, line) 
     for match in matches: 
      # for each match found, remove unwanted commas and replace them 
      new_cell = match.replace(b',', b' ') 
      line = re.sub(match, new_cell, line) 
     # write line to file 
     outfile.write(line) 
     elif row_count == 0: 
     # header row, copy it 
     outfile.write(line) 
     row_count += 1 
os.remove(filename)  
os.rename('temp.csv',filename) 
関連する問題