2016-12-11 4 views
0

Excelで開くことができないCSVファイルがあります。奇妙なCSV区切り文字を変更するにはどうすればよいですか?

CSVデリミタは|~|で、行の最後は|~~|です。 Education|~|Name_Dutch|~|Name_English|~|Faculty|~~|

とデータ/行の一部は次のとおりです:ヘッダー部分がある

Education|~|Name_Dutch|~|Name_English|~|Faculty|~~|International Business|~|MB|~|MB|~|ED|~~| 

は、私はいくつかのサンプルデータを持っている私は、これを変更する方法を見つける必要がありInternational Business|~|MB|~|MB|~|ED|~~|

CSVファイルを通常の,のカンマ区切りの値でPythonスクリプトを使用して作成します。

+0

それは、区切り文字は比較的一般的である私には見えます「|」が、あなたは、少なくとも表示する必要がありますヘッダーのように見えるだけでなく、数行のデータが必要です。 – Anthon

+0

私は少しのデータを与えました、ヘッダー部分は次のとおりです:教育|〜| Name_Dutch |〜| Name_English |〜| Faculty | ~~ |データ部は:国際ビジネス|〜| MB |〜| MB |〜| ED | ~~ | –

+1

あなたの最初の投稿から欠けていた余分な情報を含めるためにあなたの投稿を常に編集し、コメントに隠すことはありません。 – Anthon

答えて

0

あなたはビルトインcsvモジュール+ string.split()機能を支援することができます:私は、それが出力CSVファイルを扱う場合output.csv

Education,Name_Dutch,Name_English,Faculty 
International Business,MB,MB,ED 
"" 

という名前のファイルを意志

import csv 

content = """Education|~|Name_Dutch|~|Name_English|~|Faculty|~~|International Business|~|MB|~|MB|~|ED|~~|""" 

# Or read it's content from a file 

with open('output.csv', 'w+') as f: 
    writer = csv.writer(f) 
    lines = content.split('|~~|') 
    for line in lines: 
     csv_row = line.split('|~|') 
     writer.writerow(csv_row) 

をだろうcsvモジュールを使用すると、.replace('|~|', ',')の代わりにcsvモジュールを使用することをお勧めしますのような特殊文字の組み込みサポート,

0

あなたが言及しているカスタム区切り文字は、それらにstring.replaceを行うだけで十分です。その後、ファイルを書き出します。 読み取りと書き込みのセクションには、必要なすべての詳細があります。 csv.readerとして https://docs.python.org/2/tutorial/inputoutput.html

0
import csv 

in_name = 'your_input_name.csv' 
outname = 'your_outpt_name.csv' 

with open(in_name, newline='') as csvfile: 
    csvreader = csv.reader(csvfile, delimiter='~', quotechar='|') 
    with open(outname, "w", newline='') as outfile: 
     csvwriter = csv.writer(outfile, quotechar='"', quoting=csv.QUOTE_NONNUMERIC) 
     for row in csvreader: 
      line = [] 
      for item in row: 
       if item != "": 
        line.append(item) 
       else: 
        csvwriter.writerow(line) 
        line = [] 

""に変換し、行の末尾として"~~"を認識し、そう""に達するまでcsv.writerために、我々は、繰り返し(csv.readerから得られた)リストの一部を用意しません。

0

ファイルが小さい場合は、その内容全体をメモリに読み込んで見つけた奇妙な区切り文字を置き換えて、新しいバージョンのファイルを書き戻すことができます。

ファイルが大きい場合や、メモリ使用量を節約したい場合は、ファイルを段階的に1文字ずつ読み込み、実行する必要があることを実行することもできます。

csv.readerコンストラクタへの引数 "csvfile"は、イテレータプロトコルをサポートし、next()メソッドが呼び出されるたびに文字列を返すオブジェクトです。

これは、「オブジェクト」がジェネレータ関数またはジェネレータ式であることを意味します。以下のコードでは、奇妙にフォーマットされたファイルを解析する単純なFSM(Finite State Machine)と、それが検出する出力の各行yieldを実装しました。これは、多くのコードのように見えるが、それはどのように動作するかを理解することは比較的容易でなければなりませんので、非常に簡単に操作することがあります。

import csv 

def weird_file_reader(filename): 
    """Generator that opens and produces "lines" read from the file while 
     translating the sequences of '|~|' to ',' and '|~~|' to '\n' (newlines). 
    """ 
    state = 0 
    line = [] 
    with open(filename, 'rb') as weird_file: 
     while True: 
      ch = weird_file.read(1) # read one character 
      if not ch: # end-of-file? 
       if line: # partial line read? 
        yield ''.join(line) 
       break 
      if state == 0: 
       if ch == '|': 
        state = 1 
       else: 
        line.append(ch) 
        #state = 0 # unnecessary 
      elif state == 1: 
       if ch == '~': 
        state = 2 
       else: 
        line.append('|'+ch) 
        state = 0 
      elif state == 2: 
       if ch == '|': 
        line.append(',') 
        state = 0 
       elif ch == '~': 
        state = 3 
       else: 
        line.append('|~'+ch) 
        state = 0 
      elif state == 3: 
       if ch == '|': 
        line.append('\n') 
        yield ''.join(line) 
        line = [] 
        state = 0 
       else: 
        line.append('|~~'+ch) 
        state = 0 
      else: 
       raise RuntimeError("Can't happen") 

with open('fixed.csv', 'wb') as outfile: 
    reader = csv.reader((line for line in weird_file_reader('weird.csv'))) 
    writer = csv.writer(outfile) 
    writer.writerows(reader) 

print('done') 
関連する問題