2017-06-28 11 views
0

だから私はいくつかのファイルを読むためにサブルーチンを作成し...ここでは、コードがあります:C#でファイル内のサブストリングを読み込むのに役立つ必要がありますか?

dataGridView1.Rows.Clear(); 

      string[] lines = File.ReadAllLines(Application.StartupPath + listBox1.Text + ".txt"); 

      foreach (string line in lines) 
     { 

      int posicion1 = line.IndexOf("|") + 1; 
      int posicion2 = line.IndexOf("|", posicion1) + 1; 
      int posicion3 = line.IndexOf("|", posicion2) + 1; 
      int posicion4 = line.IndexOf("|", posicion3) + 1; 


      data1 = line.Substring(0, posicion1 - 1); 
      data2 = line.Substring(posicion1, posicion2 - posicion1 - 1); 
      formacao = line.Substring(posicion2, posicion3 - posicion2 - 1); 
      relatorio = line.Substring(posicion3, posicion4 - posicion3 -1); 

      dataGridView1.Rows.Add(data1, data2, formacao, relatorio); 


     } 

しかし、それはDataGridViewのに変数「relatorio」を追加することになると、それはちょうど私が保存されている行全体を追加します私の上の...ここで私は例えば、私のファイルからの行を保存しています方法です変数:

28デjunhoデ2017 | 28デjunhoデ2017 | fsdfsdfsd | NAOは

あなたが見ることができるように、私は」すべての変数を "|"で区切ります。 集計すると、 "Não"を追加したばかりのときにENTIRE行(28 de junho de 2017 | 28 de junho de 2017 | fsdfsdfsd |Não)を追加するだけの変数relatorioを除いて、プログラムは正常に動作します。

誰かが私を助けることができますか?申し訳ありませんが、質問が十分に明確でない場合。

からUPDATE

だから私が代わりにこれを使用しようとしました:

foreach (string line in lines) 
     { 

      string[] _line = line.Split('|'); 
      string value1 = _line[0]; 
      string value2 = _line[1]; 
      string value3 = _line[2]; 
      string value4 = _line[3]; 
      dataGridView1.Rows.Add(value1, value2, value3, value4); 


     } 

が、それでも私のプログラムは、同じ過ちをまま... を私が考えることを始めているというI私のファイルを正しく保存していないのですが、私は本当にどこにもいないのです...プログラムを閉じるとファイルは同じタイプのままです:

28 de junho de 2017 | 28 de junho de 2017 | fwfew |いいえ

もちろん、時間があれば誰でもテストできますか?

+10

理由だけではなく、[のstring.Split](httpsを使用しない://をmsdn.microsoft.com/en-us/library/system.string.split(v=vs.110).aspx)? –

答えて

0

IndexOfを使用すると、状況が少し複雑になります。あなたは自分の値を取得するためにSplitメソッドを使用することができます。

foreach (string line in lines) 
{ 
    string[] _line = line.Split('|'); 
    string value1 = _line[0]; 
    string value2 = _line[1]; 
    ... 

    dataGridView1.Rows.Add(value1 , value2 , ...); 
} 
2

StringクラスがすでにSplit方法があります。

var parts=line.Split('|'); 
dgv1.Rows.Add(parets[0], parts[1], parts[2], parts[3]); 

様々なスプリットのオーバーロードを使用すると、複数の区切り文字を使用して、空の結果を排除することができます

おそらくCsvHelperのようなパーサーを見るべきでしょう。それは例えば、カスタムマッピングおよび変換を許可し、オブジェクトに直接CSVデータを解析し、マッピングすることができます。

public class MyClass { public string Data1{get;set;} ...} 

using(var reader=File.OpenText(csvPath)) 
{ 
    var csv = new CsvReader(textReader); 
    csv.Configuration.Delimiter = "|"; 
    var records = csv.GetRecords<MyClass>().ToList(); 
    dgv1.DataSource=records; 
} 

またはLINQを使用します。

var records = csv.GetRecords<MyClass>().Where(it=>it.Data1 >=...).ToList();