2016-08-30 9 views
1

私のCSVデータは、何かがこのようになりますされ、それをエクスポートします。読むのcsvマルチコラム&

Device data for period 30/08/2016 to 30/08/2016 
Site ID,Time,INC1_MD 
VSI-18,2016-08-30 00:00:00,165.954 
VSI-18,2016-08-30 00:01:00,14.524 
VSI-18,2016-08-30 00:02:00,32.920 
VSI-18,2016-08-30 00:03:00,48.508 
VSI-18,2016-08-30 00:04:00,62.418 

.....

と私は最初の2行を無視して「VSI-18で起動しよう...」 と日付の後&時間欄 ある3列目のデータを抽出し、同様に、新しいCSVファイルに日 につき1列を書き出す:

day1,day2,day3 
100,200,300 
200,123,123 
123,222,444 
.... 

、ここでは、私はまだデータを読み取る方法を見つけ出すことはできませんので、私はまだ完了していないエクスポートデータコードのための私のコード

 o_csv_loc.Text = varFile; //csv data file location 
     save_file_loc.Text = saveloc; //new csv file location 

     var reader = new StreamReader(File.OpenRead(varFile)); 
     List <string[]> listA = new List<string[]>(); 
     List<string[]> listB = new List<string[]>(); 
     List<string[]> listC = new List<string[]>(); 

     //I think these two code below is to skip first 2 line of csv data     
     //file and start read the third line (VSI-18...) 
     reader.ReadLine(); 
     reader.ReadLine(); 

     while (reader.Peek() > -1) 
     { 
      var line = reader.ReadLine(); 
      var values = line.Split(';'); 

      listA.Add(new string[] { values[0] }); 
      listB.Add(new string[] { values[1] }); 
      listC.Add(new string[] { values[2] }); 
      //I think that listC is suppose to extract the data after the 
      //second comma which is third column 
     } 

です。

listB.Add(new string[] { values[1] }); 

ライン

上のデバッグ、「System.IndexOutOfRangeException」ショーは、このライン上問題になることはありませんされていない場合?値[0]はまだ問題ではありません。

EDIT

私はエクスポートデータに成功新しいCSVファイルへ

var reader = new StreamReader(File.OpenRead(varFile)); 
     List <string[]> listA = new List<string[]>(); //here are the code 
     //changed 

     List<string[]> listB = new List<string[]>(); 
     List<string[]> listC = new List<string[]>(); 
     reader.ReadLine(); 
     reader.ReadLine(); 

     while (reader.Peek() > -1) 
     { 
      var line = reader.ReadLine(); 
      var values = line.Split(','); 

      listA.Add(new string[] { values[0] }); 
      listB.Add(new string[] { values[1] }); 
      listC.Add(new string[] { values[2]}); 

     } 

     using (System.IO.TextWriter writer = File.CreateText(saveloc)) 
     { 
      for (int index = 0; index < listC.Count; index++) 
      { 
       writer.WriteLine(string.Join(",", listC[index]) + ','); 
      } 
     } 

結果がこれです:

165.954, 
14.524, 
32.920, 
48.508, 
62.418, 
79.151, 
96.982, 

私はまだ新しい日付を検出し、新しい投入する方法を考え出しますカラム

+2

あなたは ';'で分割しています。私はあなたのファイルにそれらのどれも表示されません。 – Blorgbeard

+0

スニペットマークアップでHTML/JS/CSS以外のコードをラップしないでください。 4つのスペースでインデントするだけで十分です(または強調表示し、 '{}'ボタンをクリックしてください)。 – Blorgbeard

+0

@Blorgbeardが述べたように、私はあなたが '、'の代わりに ';'に分割したいと思う –

答えて

0

まず、あなたのコードでは... ;を区切り文字として使用していますが、CSVファイルは,を使用しています... var values = line.Split(';');の結果は1つの要素しか含まれていません。

第2に、誤ったフォーマットや破損したデータからアプリケーションを保護します。例えば、

var line = reader.ReadLine(); 

if(string.IsNullOrEmpty())//<--empty row 
    continue;//<--ignore, or else add empty values to your in-memory lists 

var values = line.Split(','); 

listA.Add(new string[] { values.length > 0 ? values[0] : string.Empty }); 
listB.Add(new string[] { values.length > 1 ? values[1] : string.Empty }); 
listC.Add(new string[] { values.length > 2 ? values[2] : string.Empty }); 

//or simply 

if(values.length < 3) 
    continue;//<--ignore, or else add empty values to your in-memory lists 
0

いくつかの点。

区切り文字(;)が実際に文字列を分割しないため、エラー/例外が発生する可能性があります。values[1]IndexOutOfRange例外をスローします。正しいデリミタを使用してください(,必要なもの)。

csv(同じ文字列で)を新たに生成する予定の場合、なぜ文字列を分割する必要がありますか?ファイルに直接書き込むことはできません(,が区切られているとします)。

var sb = new StringBuilder(); 
while (reader.Peek() > -1) 
{ 
    var line = reader.ReadLine(); 
    sb.AppendLine(line); 
} 

// Write to file. 
File.WriteAllText(filePath, sb.ToString()); 
+0

私は、csvデータファイル(新しいCSVファイルを自動的にダウンロードするダウンローダを持っています)を読んで、1日に新しい列に入れたいと思っています。ご覧のように、サンプルデータは8月30日です。欲しいデータは2番目のカンマの後です。 新しいcsvファイルにそのデータを抽出したいと思います。 新しい日を開始すると、day1のデータ、day2のデータ、day3のデータ – oks1998

+0

のように、昨日のデータの横に新しい日のデータが書き出されます。これは本当に意味するものです(最初のカンマまで)必要な場合はcsvファイルをダウンロードして新しい列を追加し、新しいファイルに書き込みます。 –

+0

私はあなたの意味を知っていますが、私のデータはこのようなものです(コメントは誤解の原因になりますか?) [詳細はこちら](http://pastebin.com/vP9r9Yzm) Day1のデータは収集され、完了する必要があります最初のDay2データが来る前に。私は1ヶ月間のデータ収集と書き込みを待つことができません.appendを使用すると、すべてのday1データが最初に書き込まれ、day2が来ると、新しい列にday2データが書き込まれます。 – oks1998