2016-05-26 2 views
0

私はCSVファイル(A)、抽出データからデータを読み込み、別のCSVファイル(B)にそれを記述しようとしています。新しいファイルBでは、2つの行が必要です。最初の行は、私は誰もが私にこれを達成するための最良の方法を伝えることを願って行に特定の変数に属しているすべての値1.パイソン - 読みとする.CSVからデータを割り当てる事前定義された変数

で満たされるべきすべての定義済みの変数と行2が含まれている必要があります。

(A)Pythonコード

import re 
import csv 

#Call for the export file 
data = open('C:/Exports/Export 3.csv') 

#Make a list with the predefined variables 
definition = ["record_id", "abbreviation", "study_id", "step_count", 
"distance", "ambulation_time", "velocity", "cadence", "norm_velocity", 
"step_time_differential", "step_length_differential", 
"cycle_time_differential", "step_time", "step_length", "step_extremity", 
"cycle_time", "stride_length", "hh_base_support", "swing_time", 
"stance_time", "single_support_time", "double_support_time", "toe_in_out"] 

my_data = {} 

#Show data for each row without whitespace 
for line in data: 
    line = line.rstrip() 
    #print(line) 
    values = re.findall("-?[0-9].+", line) 
    print(values) 

を(私はこの記事の最後に使用される.csvファイルを追加した)これは、上記のコードが生成される出力の一部である:

これら2つの値の平均の前を算出することで、1つの値になる必要があります; [「6,32 2988」]:あなたは出力コードに見ることができるように
[] 
['3;'] 
['292,34;'] 
['1,67;'] 
['175,1;'] 
['107,8;'] 
[] 
['0,004;'] 
['1,051;'] 
['0,008;'] 
[] 
[] 
['0,558;0,554'] 
['96,746;97,797'] 
[] 
['1,116;1,108'] 
['192,159;197,122'] 
['2,988;6,32'] 
['0,466;0,466'] 
['0,65;0,642'] 
['0,466;0,466'] 
['0,184;0,176'] 
['41,8;42,1'] 
['58,2;57,9'] 
['41,8;42,1'] 
['16,5;15,9'] 
['-1,1;4'] 

、のような2つの値を含んでいくつかの行があります書くcsvファイルへの裾。

(B)所望の出力

record_id abbreviation study_id step_count distance 
1         3   292,34 

あなたが好きなら、あなたはここでそれをダウンロードすることができますエクスポートファイルを再生することができます: CSV export file

+0

あなたは答えを作らされませんので、入力とサンプル出力をサンプリングに関するより多くの情報を与える –

+0

ありがとう:私は、平均値を計算するループのために、次のコードを適用しようとしました!テキストを変更して理解しやすくし、最後に使用した.csvファイルを追加しました。また、希望する出力の例も追加しました。 – Yak

答えて

0

あなたはcsvライブラリを使用してファイルを開く必要があります、semi-colonを区切り、最初の列を定義内の項目と比較します。

import csv 
from collections import defaultdict 

data = defaultdict(str) 

#Make a list with the predefined variables 
definition = ["record_id", "abbreviation", "study_id", "step_count", 
"distance", "ambulation_time", "velocity", "cadence", "norm_velocity", 
"step_time_differential", "step_length_differential", 
"cycle_time_differential", "step_time", "step_length", "step_extremity", 
"cycle_time", "stride_length", "hh_base_support", "swing_time", 
"stance_time", "single_support_time", "double_support_time", "toe_in_out"] 

with open('C:/Exports/Export 3.csv', 'r') as f, 
    open('C:/Exports/result.csv', 'w') as outfile: 
    reader = csv.reader(f, delimiter=';') 
    next(reader, None) # skip the headers 

    writer = csv.DictWriter(outfile, fieldnames=definition, lineterminator='\n') 
    writer.writeheader() 

    for row in reader: 
     for item in definition: 
      h = item.replace('_','') 
      r0 = row[0].lower().replace(' ','') 
      if h in r0: 
       print(h, r0) 
       data[item] = row[1] 

    data['record_id'] = 1 # record id does not exist in input file: Export 3.csv 

    writer.writerow(data) 

は、項目の平均取得するには、使用することができます:これはかなりというん

try: 
    avg = (float(row[1].replace(',', '.')) + float(row[2].replace(',', '.')))/2 
except ValueError: 
    avg = 0 # for cases with empty strings or commas 
+0

ありがとう!これは私のbigtimeを助けている!、私はまだ答えの下に投稿したいくつかの小さな問題があります。 – Yak

+0

こんにちは@ヤク、あなたは、 '定義'を入力ファイルの名前にもっと密接に一致させることで、不一致を修正することができます。平均化については、私の更新を参照してください –

+0

これは私も私もモーゼスと考えていたが、例えば速度は正確に速度に一致しますが、result.csvでは速度値は空です。これは起こると思われます。速度の変数にはstridevelocitystddevのようなものがあります。 平均的には、コード内のどこに配置すればよいのでしょうか。それで、result.csvにも渡されますか? – Yak

0

それはほぼ完璧です!小さな問題があるようです。以下の情報を私に戻っています

print(h, r0, row[1], row[2]) 

:私は結果を確認するために、コードのこの部分を使用し

step_time 
step_length 
cycle_time 
stride_length 
hh_base_support 
swing_time 
stance_time 
single_supp_time  
double_supp_time  
toe_in_out 

:result.csvで iは、次の変数の値が欠落しています:上記の出力から

stepcount stepcount 3 
distance distance 292,34 
ambulationtime ambulationtime 1,67 
velocity velocity 175,1 
cadence cadence 107,8 
velocity normalizedvelocity , 
normalizedvelocity normalizedvelocity , 
steptimedifferential steptimedifferential 0,004 
steptime steptimedifferential 0,004 
steplengthdifferential steplengthdifferential 1,051 
steplength steplengthdifferential 1,051 
cycletimedifferential cycletimedifferential 0,008 
cycletime cycletimedifferential 0,008 
steptime steptime(sec) 0,558 0,554 
steplength steplength(cm) 96,746 97,797 
stepextremity stepextremity(ratio) , , 
cycletime cycletime(sec) 1,116 1,108 
stridelength stridelength(cm) 192,159 197,122 
hhbasesupport hhbasesupport(cm) 2,988 6,32 
swingtime swingtime(sec) 0,466 0,466 
stancetime stancetime(sec) 0,65 0,642 
velocity stridevelocity 172,185 177,908 
steptime steptimestddev , 0,006 
stridelength stridelengthstddev , , 
swingtime swingtimestddev , , 
stancetime stancetimestddev , , 
velocity stridevelocitystddev , , 
singlesupptime singlesupptimestddev , , 
doublesupptime doublesupptimestddev , , 

は、あなたが(速度のような)複数の文字列と一致する名前を持ついくつかの問題がある見ると、いくつかのすべて(toe_in_outのような)I Hに一致することはできませんこの問題を解決する方法はありません。

はまた、私は、2つの値があるたび平均値を計算しようとしたが、これは私にエラー与える:とValueError:float型に文字列を変換できませんでしたが。コンマの原因が原因だと思います。

float(row[1]+float(row[2]))/2 
関連する問題