2017-04-12 6 views
0

コードを作成しようとしていますが、基本的には目的のファイルを開き、すべての行を配列に格納してから、ファイル。プログラムを実行すると、ライン・リーダーにエラー・メッセージが表示され、その索引は配列の外にあります。C#ファイル行を配列に格納して、選択した行を保存します。

for (int i = 0; i < NumLines; i++) 
       ^

しかし、あなたは他のファイルに書き込むために、配列に行を配置する必要がありません。私はC#

int NumLines = new StreamReader(OpenFile.FileName).ReadToEnd().Split(new char[] { '\n' }).Length; 
      StreamReader Data = new StreamReader(OpenFile.FileName); 
      string[] arr = new string[NumLines]; 
      for (int i = 0; i <= NumLines; i++) 
      { 
       StreamWriter File = new StreamWriter("C://Users//Tomas//Desktop//BC//tmp//Data.txt"); 
       arr[i] = Data.ReadLine(); 
+0

おそらく、同じファイルを2回読んでいない...しかし、なぜあなたは途中で二回ファイルを読み込む必要がありますか? :) –

+0

一度私は行の数を見つけて特定の行を見つけるためにそれらを読んでいました –

答えて

3

インデックスが配列のサイズよりも小さくなければならないに新しいです、助けてください。例えば。あなたは条件によってのみ、いくつかの行を書きたい場合:

条件はラインが書かれるべきかどうかをチェックするデリゲートです
File.WriteAllLines(newFileName, File.ReadLines(OpenFile.FileName).Where(condition)); 

。例えば。

.Where(line => line.StartsWith("Foo")) 

注:あなたが"Foo"で始まる行だけ書きたい場合

File.Copy(OpenFile.FileName, newFileName); 
:そして、あなたは条件なしで新しいファイルへのすべての行を書きたい場合には、単に 元のファイルをコピーすることができます

更新:あなたのコメントから、いくつかの条件に一致する行を見つけて、その行の6番目と8番目の行を出力する必要があることは明らかです。あなたはまだメモリにすべてのソースファイルをダンプすることなく、それを行うことができます。

private static IEnumerable<string> GetVertexCoordinates(string fileName) 
{ 
    var enumerator = File.ReadLines(fileName).GetEnumerator(); 

    while (enumerator.MoveNext()) 
    { 
     if (enumerator.Current == "VERTEX") 
     { 
      yield return enumerator.Current; 

      for (var i = 0; i < 6; i++) enumerator.MoveNext(); // skip 6 lines 
      yield return enumerator.Current; 

      for (var i = 0; i < 2; i++) enumerator.MoveNext(); // skip 2 more lines 
      yield return enumerator.Current; 
     } 
    } 
} 

と使用方法は、まだワンライナーで

File.WriteAllLines(newFileName, GetVertexCoordinates(OpenFile.FileName)); 
+0

@TomasMichalek so ..あなたはソースファイル内に "VERTEX"行を見つけて、出力に3行を書きたいと思います: "VERTES"と2行ソースファイルから+6と+8のインデックスを使用していますか? –

+0

ありがとうございます。しかし、私は特定の行を見つけていくつかの行を書いて欲しいので、配列にしたい。 条件の例: '' if(arr [i] == "VERTEX") { File.WriteLine( "VERTEX"); File.WriteLine(arr [i + 6]); File.WriteLine(arr [i + 8]); } –

+0

@TomasMichalekあなたは私の質問に答えることができますか?はい、いいえのようなものです:)そして、「いいえ」の場合はいくつかのコメント –

1

をこの方法を試してみてください:

string[] lines = File.ReadAllLines(filepath); 

次に、あなたが必要な場合はこのファイルのすべての行をあなたの行と比較するには、次のようにします:

string targetFilePath = "C://Users//Tomas//Desktop//BC//tmp//Data.txt"; 
string specificLine = "line, which you try to find"; 
foreach (var line in lines) 
    if (line.Equals(specificLine)) 
     File.WriteAllText(targetFilePath, line); 
0

あなたのコードは、この方法をshortcuttedすることができ...

/// Disposal of your reader when unused is essential to close your file 
    using(var reader = new StreamReader(OpenFile.FileName)) 
    { 
     var lines = reader.ReadToEnd().Split(new char[] { '\n' }); 
     int NumLines = lines.Length; 
     for (int i = 0; i < NumLines; i++) 
     { 
      ... do something here 
     } 
    } 
関連する問題