2015-02-15 4 views
0

Мне нужна помощь для разделения csv на список. Вот входной файл и выходной файл, который мне нужен.Разделить входной формат файла на несколько строк, интерполировать числовые диапазоны «n-m»

У меня есть CSV-файл, который выглядит примерно так (строка за строкой):

1-6 
97 
153,315,341,535 
15,~1510,~1533,~1534,~1535,~1590 

мне нужен выход, чтобы быть:

Col 1 Col 2 
1  ~1510   
2  ~1533 
3  ~1534 
4  ~1535 
5  ~1590 
6 
97 
153 
315 
341 
535 
15 

Значение, когда я обнаруживаю знак "-" пример 1 -6 будет (1 до 6) и разделить число с и без «~» на 2 разных столбца

Однако результаты, полученные мной с моим кодом, следующие:

Col1 Col2 Col3 Col4 Col5 Col6 
6-Jan 
97 
153  315  341 535 
15  ~1510 ~1533 ~1534 ~1535 ~1590 

мой код:

import csv 

with open('testing.csv') as f, open("testing1.csv", "w") as outfile: 
    writer = csv.writer(outfile) 
    f.readline() # these are headings should remove them 
    csv_reader = csv.reader(f, delimiter=",") 
    for line_list in csv_reader: 
    skills_list = [line_list[0].split(',')] 
    for skill in skills_list: 
     writer.writerow(skill) 

Пожалуйста, помогите. Большое спасибо.

+1

вход не является допустимым файлом CSV. – tripleee

ответ

0

Вы не можете записать вывод, пока не прочитаете требуемый ввод. Таким образом, первая выходная строка может быть записана, когда вы получили вход ~1510.

Простейшим решением является считывание всего входного файла в память, а затем запись. Я бы сохранил два списка, затем нажмите на первый, если не тильда, иначе на другую. Затем для вывода просто перебирайте эти списки, предоставляя пустые значения, если один из них заканчивается.

Если вам нужно оптимизировать использование памяти (например, если есть больше ввода, чем вы можете поместиться в память), возможно, напишите каждую строку, как только сможете, и освободите ее память; но это становится более сложной задачей.

1

Так я и сделал бы это. сначала прочитайте все данные и постройте свои столбцы. Затем перебирайте столбцы и создавайте свои csv.

Вот код для построения столбцов.

import csv 
fin = open('testing.csv', 'r') 
column_1 = [] 
column_2 = [] 
for line in fin: 
    items = line.split(',') 
    for item in items: 
     if '-' in item: 
      num_range = item.split('-') 
      column_1 += range(int(num_range[0])+1, int(num_range[1])+1) 
     elif '~' in item: 
      column_2.append(item.strip()) 
     else: 
      column_1.append(item.strip()) 

fin.close() 
0
import itertools as it 

results = { 
    'col1': [], 
    'col2': [], 
} 

with open('data.txt') as f: 
    for line in f: 
     line = line.rstrip() 
     entries = line.split(",") 

     for entry in entries: 
      if entry.startswith('~'): 
       column = 'col2' 
       entry = entry[1:] 
      else: 
       column = 'col1' 

      if '-' in entry: 
       start, end = entry.split('-') 
       results[column].extend(
        list(range(int(start), int(end)+1)) 
       ) 
      else: 
       results[column].append(entry) 

print("{} \t {}".format('Col 1', 'Col 2')) 

column_iter = it.zip_longest(
    results['col1'], 
    ["~{}".format(num) for num in results['col2']], 
    fillvalue='' 
) 

for col1_num, col2_num in column_iter: 
    print(
     "{} \t {}".format(col1_num, col2_num) 
    ) 


--output:-- 
Col 1 Col 2 
1  ~1510 
2  ~1533 
3  ~1534 
4  ~1535 
5  ~1590 
6  
97 
153  
315  
341  
535  
15 

И с этим data.txt:

1-6 
~7-10,97 
153,315,341,535 
15,~1510,~1533,~1534,~1535,~1590 

выход:

Col 1 Col 2 
1  ~7 
2  ~8 
3  ~9 
4  ~10 
5  ~1510 
6  ~1533 
97  ~1534 
153  ~1535 
315  ~1590 
341  
535  
15