2011-09-14 18 views
1

C#開発の初心者です。私は1行に数行のデータを含む巨大なテキストファイルを解析する必要があります。出力はCSVファイルになります。CSVへのテキストファイルの解析C#

ファイルの形式は次のパターンに従います。

 
Acronym: TIFFE 
Name of proposal: Thermal Systems Integration for Fuel Economy 
Contract number: 233826 
Instrument: CP – FP 
# 
Acronym: STREAMLINE 
Name of proposal: Strategic Research For Innovative Marine Propulsion Concepts 
Contract number: 233896 
Instrument: CP – FP 

#新しいレコードを表します。今、このテキストファイルには何百もの「レコード」があります。頭字語、プロポーザル名などの列と各レコードの実際のデータを含む行をCSVにすべて解析できるようにしたいと考えています。

これを行うには最良の方法がありますか?

データを解析してCSVにする前に、DataTableのような仲介にデータを解析する必要があると思います。

答えて

3

この単純なLINQ文は、レコードのシーケンスに入力ファイルを解析し、出力ファイルにCSV形式で各レコードを書き込みます(各レコード内のフィールドの数と順序が同じであると仮定して):

File.WriteAllLines("output.csv", File 
    .ReadLines("input.txt") 
    .GroupDelimited(line => line == "#") 
    .Select(g => string.Join(",", g 
     .Select(line => string.Join(line 
      .Substring(line.IndexOf(": ") + 1) 
      .Trim() 
      .Replace("\"", "\"\""), "\"", "\""))))); 

出力:

 
"TIFFE","Thermal Systems Integration for Fuel Economy","233826","CP – FP" 
"STREAMLINE","Strategic Research For Innovative Marine Propulsion Concepts","233896","CP – FP" 

ヘルパーメソッド:

static IEnumerable<IEnumerable<T>> GroupDelimited<T>(
    this IEnumerable<T> source, Func<T, bool> delimiter) 
{ 
    var g = new List<T>(); 
    foreach (var x in source) 
    { 
     if (delimiter(x)) 
     { 
      yield return g; 
      g = new List<T>(); 
     } 
     else 
     { 
      g.Add(x); 
     } 
    } 
    yield return g; 
} 
+0

これは長いコード行です。 – Brad

+0

Yikes! +1のための可読性:) –

+0

'System.Collections.Generic.IEnumerable 'に 'GroupDelimited'の定義がなく、 'System.Collections'型の最初の引数を受け入れる拡張メソッド 'GroupDelimited'がありません。 \t c:\ users \ user \ documents \ visual studio 2010 \ Projects \ Fileparser \ Fileparser \ Program.cs –

1

:ここ

は、より良い説明です。ソースファイルを読み込むときに、直接CSVをStreamWriteすることができます。ソースの各レコードのフィールドの順序と存在が一貫していれば、これは簡単です。

しかし、CSVと何か関係がある場合は、専用ライブラリの使用を検討する必要があります。 FileHelpersのように。

+0

+1:特殊なライブラリは、カンマと二重引用符(データに現れる場合は改行文字も含む)を正しく扱います。二重改行があなたの例に現れるようにフィールド区切りを示すならば、ファイル形式_may_は改行をデータとしてサポートします)。 –

関連する問題