2012-04-04 3 views
1

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

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

RawData= 
[[M1,A1,305.91,288.12,Variable_M1_A1], 
[M1,A2,319.07,303.70,Variable_M1_A2], 
[M2,A1,237437.32,191460.91,Variable_M2_A1], 
[M2,A2,270773.28,192581.05,Variable_M2_A2]] 

То, что я хотел бы сделать с некоторыми из данных организовать его таким образом, чтобы сетка создается из переменных А и М, а затем данные из столбца помещается в правильное местоположение сетки. Реалистично выглядит как простая двухмерная матрица с первой строкой и первым столбцом, обозначающим переменные.

Что-файл должен выглядеть следующим образом:

Placeholder,A1,A2 
M1,Variable_M1_A1,Variable_M1_A2 
M2,Variable_M2_A1,Variable_M2_A2 

То, что я в данный момент делаю создаю пустую матрицу (3x3 в данном случае), назвав его результат затем запустить следующий код. В основном итерации по всем строкам и всем переменным, когда переменные совпадают, он присваивает матрице результатов значение из RawData.

MVar=[M1,M2] 
AVar=[A1,A2] 
for a in range(len(RawData): 
    for b in range(len(MVar)): 
     for c in range(len(AVar)): 
      if RawData[a][0]==Mvar[b] and RawData[a][1]==AVar[c]: 
       Result[b+1][c+1]=RawData[a][4] 

Я написал кусок кода, который будет принимать матрицу RAWDATA и создать матрицу Результат на основе от всех возможных комбинаций M1 и A1. Если я хочу экспортировать это в .csv, я просто использую csv.writer. Так что это отлично работает, если я просто хочу организовать данные, которые уже есть. Однако, когда я хочу делать вычисления с данными, например, генерируя другой столбец, основанный на значениях в RawData, которые не попадают в матрицу, становится трудным. Например, чтобы принять то, что выходной файл CSV может выглядеть следующим образом:

Placeholder,A1,A2,NewA 
M1,Variable_M1_A1,Variable_M1_A2,(RawData[0][3]*RawData[1][2]) 
M2,Variable_M2_A1,Variable_M2_A2,(RawData[2][3]*RawData[3][2]) 

Обратите внимание, что данные для расчетов требуется одинаковое значение M, но разные значения A. Хотя это можно сделать, он быстро становится очень запутанным.

Есть ли более простой способ сделать это?

Edit: Авто поколение M и список с помощью:

[MethodList[i] for i,x in enumerate(MethodList) if x not in MethodList[i+1:]] 

Это, кажется, делает его легче работать, однако его до сих пор процесс свернутом!

ответ

0

Это было выполнено с помощью циклов for и соответствующих условий if. Я все еще убежден, что есть лучший способ, но это вполне возможно сделать.