Поиск определенного текста в файле CSV (в формате Excel) - PullRequest
0 голосов
/ 29 августа 2018

Образец CVS

Итак, у меня есть CSV-файл (пример в ссылке выше), с именами переменных в строке 7 и значениями в строке 8. Все переменные имеют единицы после них, а значения - просто числа, подобные этому:

Velocity (ft/s) Volumetric (Mgal/d  Mass Flow (klb/d)   Sound Speed (ft/s)                  
.-0l.121            1.232                  1.4533434          1.233423

Есть еще много переменных, но в основном мне нужен какой-то способ поиска в файле csv целевых групп юнитов, а затем добавить значение, связанное с этим, в список. Например, выполните поиск текста «(футы / с)», а затем создайте словарь со значениями «Скорость» и «Скорость звука» в качестве ключей и связанных с ними значений. Я не могу сделать это, потому что CSV отформатирован как электронная таблица Excel, и ячейки содержат полное имя переменной с единицей измерения

В конце у меня будет словарь для каждой группы юнитов, и мне нужно сделать это таким образом, потому что каждый генерируемый csv-файл меняет группы юнитов (ft / s становится м / с). Я также не могу использовать Excel для чтения, потому что он не работает в IronPython.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Вы можете использовать модуль csv для чтения соответствующих строк в list s. defaultdict - хороший выбор для агрегирования данных, в то время как переменная имена и единицы могут быть легко разделены путем разделения на '('.

import csv
import collections 

with open(csv_file_name) as fp:
    reader = csv.feader(fp)
    for k in range(6):  # skip 6 lines
        next(reader)
    varnames = next(reader)  # 7th line
    values = next(reader)    # 8th line

groups = collections.defaultdict(dict)
for i, (col, value) in enumerate(zip(varnames, values)):
    if i < 2:
        continue
    name, units = map(str.strip, col.strip(')').split('(', 1))
    groups[units][name] = float(value)

Редактировать: добавлен код пропуска первых двух столбцов

0 голосов
/ 29 августа 2018

Я помогу с частью, на которой, я думаю, вы застряли, которая пытается извлечь единицы из категории. Учитывая ваши данные, лучше всего использовать регулярные выражения, должно работать следующее:

import re
f = open('data.csv')
# I assume the first row has the header you listed in your question
header = f.readline().split(',') #since you said its a csv

for item in header:
    print re.search(r'\(.+\)', item).group()
    print re.sub(r'\(.+\)', '', item)

Это должно напечатать следующее для вас:

(ft/s)
Velocity
(Mgal/d)
Volumetric
(klb/d)
Mass Flow
(ft/s)
Sound Speed

Вы можете изменить вышеприведенное, чтобы сохранить их в списке, а затем выполнить итерацию по ним, чтобы найти дубликаты и объединить соответствующие строки со словарями или еще чем-нибудь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...