2017-06-06 2 views
-1

を使用してCSV形式にテキストファイルを再フォーマット:次の形式でのテキストの数千行からなる私は、ファイル(exOut.txt)を持っているbashスクリプト

[CV] solver=newton-cg, penalty=l2, multi_class=ovr, max_iter=187.637633813, C=0.778324314482 
[CV] solver=newton-cg, penalty=l2, multi_class=ovr, max_iter=187.637633813, C=0.778324314482 
[CV] solver=newton-cg, penalty=l2, multi_class=ovr, max_iter=187.637633813, C=0.778324314482 
[CV] solver=sag, penalty=l2, multi_class=multinomial, max_iter=187.637633813, C=0.31181629405 
[CV] solver=sag, penalty=l2, multi_class=multinomial, max_iter=187.637633813, C=0.31181629405 
[CV] solver=sag, penalty=l2, multi_class=multinomial, max_iter=187.637633813, C=0.31181629405 
[CV] solver=sag, penalty=l2, multi_class=multinomial, max_iter=187.637633813, C=0.31181629405, score=0.497312, total=11.0min 
[CV] solver=sag, penalty=l2, multi_class=multinomial, max_iter=187.637633813, C=0.31181629405, score=0.499232, total=11.0min 
[Parallel(n_jobs=-2)]: Done 2 out of 6 | elapsed: 11.0min remaining: 22.0min 
[CV] solver=sag, penalty=l2, multi_class=multinomial, max_iter=187.637633813, C=0.31181629405, score=0.499762, total=11.1min 
[Parallel(n_jobs=-2)]: Done 3 out of 6 | elapsed: 11.1min remaining: 11.1min 
[CV] solver=newton-cg, penalty=l2, multi_class=ovr, max_iter=187.637633813, C=0.778324314482, score=0.449309, total=19.6min 
[Parallel(n_jobs=-2)]: Done 4 out of 6 | elapsed: 19.6min remaining: 9.8min 
[CV] solver=newton-cg, penalty=l2, multi_class=ovr, max_iter=187.637633813, C=0.778324314482, score=0.449831, total=19.7min 
[CV] solver=newton-cg, penalty=l2, multi_class=ovr, max_iter=187.637633813, C=0.778324314482, score=0.451609, total=19.7min 
[Parallel(n_jobs=-2)]: Done 6 out of 6 | elapsed: 19.7min remaining: 0.0s 
[Parallel(n_jobs=-2)]: Done 6 out of 6 | elapsed: 19.7min finished 
... 

私はその意志シェルスクリプトを記述しようとしていますこのファイルを使用して、CSV形式の新しいファイルを作成するように再フォーマットし、「スコア」属性の行だけを記録します。これは次のようになります。

solver,penalty,multi_class,max_iter,C,score 
sag,l2,multinomial,187.638,0.312,0.497 
sag,l2,multinomial,187.638,0.312,0.499 
sag,l2,multinomial,187.638,0.312,0.500 
newton-cg,l2,ovr,187.638,0.779,0.449 
newton-cg,l2,ovr,187.638,0.779,0.450 
newton-cg,l2,ovr,187.638,0.779,0.450 

可能な場合、すべての値は1000番目の位に丸められます。

最終的に私はこのCSVをとり、 "score"を除いたすべてのフィールドを持つレコードを特定し、これらのパラメータが与えられた平均スコアで1レコードを置き換えることによって要約版を作成したいと考えています。例:

solver,penalty,multi_class,max_iter,C,avg_score 
sag,l2,multinomial,187.638,0.312,0.499 
newton-cg,l2,ovr,187.638,0.779,0.450 

助けていただければ幸いです。私は正規表現でプロではなく、主に私が尋ねる理由です。のみよりも、パターンの一つの大きな発生をかなり認識のgrep、awkのを使用して

これまで私が試したさまざまなスクリプトを含むsedは、grep '=.*,' exOut.txt

EDITフィードバックのための1人のおかげで、ここでいくつかの詳細情報です複数のフィールドと、各行の最初の部分のみを消去するsed 's/^[^\=]*\=//g' exOutput.txt > firstCSV.csvがあります。

+0

ようこそスタックオーバーフロー。これはコード作成サービスではなく、あなたの要件と言語を投稿し、誰かがあなたのためにコードを書いています。私たちは喜んでお手伝いしますが、まず問題を自分で解決し、あなたの努力をあなたの質問に含める努力をすることを期待しています。ここに尋ねる前にあなたが試みたコードを表示するには[編集]してください。詳細が必要な場合は、[ask]を参照してください。 –

+0

これは 'awk'でかなりシンプルにすべきです。試してみてください。それでもそれが得られない場合は、コードとその出力例を投稿できます。 (そして 'awk'は学ぶのに十分な時間です) – Jack

+0

bashスクリプトが必要な場合は、なぜpythonでタグ付けされていますか? –

答えて

0

1. parseRawDataFile機能を参照できます。

2.あなたはparseCsvDataFile機能を参照できます。

3.コードにハードコードがありますのでご注意ください。

import codecs 
datausage = r"e:\temp\111.txt" 
storagePath = r"e:\temp\222.csv" 
storagePath_New = r"e:\temp\222_New.csv" 
strStr = "score" 

def parseRawDataFile(path): 
    sumResult = "solver,penalty,multi_class,max_iter,C,score\r\n" 
    # [CV] solver=sag, penalty=l2, multi_class=multinomial, max_iter=187.637633813, C=0.31181629405, score=0.497312, total=11.0min 

    with open(path) as f: 

     lines = f.readlines() 
     for line in lines: 
      if strStr in line: 

       tempList = line.replace(",", "=").split("=") 
       # print(tempList) 
       sumResult += "%s,%s,%s,%.03f,%.03f,%.03f\r\n" % (tempList[1], tempList[3], tempList[5], float(tempList[7]), float(tempList[9]), float(tempList[11])) 

    # print(sumResult) 
    return sumResult 

def parseCsvDataFile(path): 
    sumResult = "solver,penalty,multi_class,max_iter,C,score\r\n" 
    # sag,l2,multinomial,187.638,0.312,0.497 

    nameList = [] 
    with open(path) as f: 
     lines = f.readlines() 
     temptSum = 0.0 
     tempNum = 0 
     for line in lines: 
      if "solver" in line: 
       continue 
      tempList = line.split(",") 
      if tempList[0] not in nameList: 
       if temptSum != 0: 
        sumResult += "%.03f\r\n" % (temptSum/tempNum) 
       sumResult += "%s,%s,%s,%.03f,%.03f," % (tempList[0], tempList[1], tempList[2], float(tempList[3]), float(tempList[4])) 

       tempNum = 0 
       temptSum = 0.0 
       nameList.append(tempList[0]) 
      if tempList[0] in nameList: 
       tempNum += 1 
       temptSum += float(tempList[-1]) 

     sumResult += "%.03f\r\n" % (temptSum/tempNum) 
    print(sumResult) 
    return sumResult 

def writeLog(f, d): 
    try: 
     f = codecs.open(f, 'w', 'utf-8') 
     f.write(d) 
     f.close() 
    except: 
     print("file is not exist.") 

result = parseRawDataFile(datausage) 
writeLog(storagePath, result) 
result = parseCsvDataFile(storagePath) 
writeLog(storagePath_New, result) 
+0

@ cricket_007ありがとうございました。エラーコードの書式を修正しました。 – saul

関連する問題