2017-09-07 24 views
1

私はMS-Visual Studio 2015を使用しており、C#でWinformsアプリケーションを開発しています。テキストファイルを読み込んでその行に書き込む方法は?

読者&投稿者は、UTF-8コーディングでCSVファイルを開き、行の行を読み込みます。私のプログラムは実際に行を読み、セミコロン(;)で分割し、その情報をデータベースに送ります。 これで、すでに読み込まれている行に、テキストまたは特別な記号を追加してマークする必要があります。 (「読んだ」または「完了しました」または「§$%」)。

誰か(ERPシステム)がそのCSVファイルに新しいデータを追加する可能性があるためです。したがって、次回のプログラムでは、そのファイルを繰り返し処理するときに、私の特別なマークなしで行を読み上げるだけです。

私のプログラム:

foreach (string sFile in Directory.GetFiles(sImportPfad, "*.*", SearchOption.TopDirectoryOnly)) 
{ 
    var oStream = new FileStream(sFile, FileMode.Append, FileAccess.Write, FileShare.Read); 
    var iStream = new FileStream(sFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

    var sw = new System.IO.StreamWriter(oStream); 
    var sr = new System.IO.StreamReader(iStream); 
    int c = 0; 

    // alle Zeilen jedes Files laden 
    while (!sr.EndOfStream) 
    { 
     String line = sr.ReadLine(); 
     String[] splitLine = line.Trim().Split(txtDivider.Text.Trim().ToCharArray()); 

     if (line.Contains("§$%")) 
      break; 

     DatenbankEintragAuftragsPool dbEintrag = new DatenbankEintragAuftragsPool(); 

      foreach (myImportFilterObject ob in arrImportFilterObjects) 
      { 
      . 
      . 
      . 
      } 

     String result = Program.myPaletti.AuftragInDieDatenbankSchreiben(dbEintrag); 

     if (result.Equals("ok")) 
     { 
      sw.WriteLine(line + " §$%"); sw.Flush(); 
     } 
    } 
} 

私の問題は、ライターが私のファイルの末尾に行+「特別なマークを」追加されています。

さらに、私はUTF-8コーディングでファイルを読み込む方法を理解していませんでした。

私はあなたの答えをありがとう!

EDIT:##############

このコードは、トリックを行うだろう...

string[] lines = System.IO.File.ReadAllLines("test"); 
lines[0] = lines[0] + " $%&"; /* replace with whatever you need */ 
System.IO.File.WriteAllLines("test", lines); 

しかし、私の使用のためにそれはにお勧めしませんすべての行を読んでください。その人は今後20年間はデータを削除しない可能性があるからです。

私はラインによって溶液ラインを見つけるために、さらに行くよ

...

+2

新しいStreamReader(stream、Encodiing.UTF8)のようなエンコーディングでStreamReaderを作成できます。しかし、ファイルの途中に何かを追加することはできませんが、データを上書きすることはできます。しかし、あなたの作家がファイルにデータを追加するだけなので、あなたが読んでいない最初のレコードの位置を(ファイル内に)保存するほうが良いかもしれません。 – Casperah

+0

@Casperah:最初の未読の行の位置を保存すると思います一貫性がない。特別な位置でデータを上書きするにはどうすればよいですか? – prototype0815

+0

ファイル全体を読み込み、変更する行(メモリ内)を変更してファイルに書き戻します。ファイルが大きすぎて一度にメモリに読み込めない場合は、一度に1行を読み込んで、新しいファイルに書き戻してから次の行に移動してください。 –

答えて

0

私はここに

using(var stream = new FileStream(sFile, FileMode.Open, FileAccess.Read) 
using(var reader = new StreamReader(stream, Encoding.UTF8)) 
{ 
    long position = GetFirstNewRecordOfFile(sFile); 
    stream.Seek(position, SeekOrigin.Begin); 
    while(!reader.EndOfStream) 
    { 
     var line = reader.ReadLine(); 
     // Process line 
    } 
    SaveFirstNewRecordOfFile(sFile, stream.Position); 
} 

解決しようとするあなたのコード内のいくつかの問題があります。今、あなたはちょうど把握する必要がありどこでどのようにファイルの位置を保存するかを指定します。

ファイルにデータを追加するライターがある場合は、時間の経過と共にファイルが大きくなる可能性があります。読み込まれたファイルを切り捨てまたは削除する方がよいかもしれません。 多くの空のファイルをループする必要がないので、ファイルを削除することをお勧めします。ただし、ファイルを閉じる前にライタープロセスがデータを追加するのを避けるためにファイルを名前変更/移動する必要があります。あなたはそれを削除します。 ファイルをサブフォルダに移動するだけの場合は、そのファイルをバックアップとして使用できます。

0

私の解決方法は、新しいファイルを作成し、このファイルに書き込み、元のファイルを削除して新しいファイルの名前を変更することです。

 foreach (string sFile in Directory.GetFiles(sImportPfad, "*.*", SearchOption.TopDirectoryOnly)) 
     { 
      FileStream iStream; 
      try 
      { 
       using (iStream = new FileStream(sFile, FileMode.Open, FileAccess.Read, FileShare.None)) 
       { 
        var sr = new System.IO.StreamReader(iStream, Encoding.UTF8); 

        if (rbCSVfilesMarkieren.Checked) 
        { 
         using (var oStream = new FileStream(sFile + "_new", FileMode.Create, FileAccess.Write, FileShare.None)) 
         { 
          var sw = new System.IO.StreamWriter(oStream, Encoding.UTF8); 
          int c = 0; 

          while (!sr.EndOfStream) 
          { 
           String line = sr.ReadLine(); 
           String[] splitLine = line.Trim().Split(txtDivider.Text.Trim().ToCharArray()); 

           if (line.Contains("$$$")) 
           { 
            sw.WriteLine(line); 
            sw.Flush(); 
            continue; 
           } 

           String result = Program.myPaletti.Irgendwasneues(splitLine, arrImportFilterObjects); 

           if (result.Equals("ok")) 
           { 
            sw.WriteLine(line + "$$$"); 
            sw.Flush(); 
            anzNeueDatensätze++; 
           } 
          } 
         } 
        } 

        System.IO.File.Delete(sFile); 
        System.IO.File.Move(sFile + "_new", sFile); 

       } 
      } 
     } 

私はまた、UTF-8コーディングが含まれています。 さらに、私はFileShare.Noneを使って、私が読み書きしているファイルをブロックする方法を見つけました。

ありがとうございました!それは有り難いです !

関連する問題