簡體   English   中英

如何讀取文本文件的一行並寫入該行?

[英]How to read a line and write to that line, of a text file?

我正在使用 MS-Visual Studio 2015,在 C# 中開發一個 Winforms 應用程序。

我想要達到的是一個讀寫器,它用 UTF-8 編碼打開一個 CSV 文件,並逐行讀取。 我的程序實際上讀取一行,用分號 (;) 將其拆分並將該信息發送到我的數據庫。 現在它應該通過附加文本或特殊符號(例如(“read”或“done”或“§$%”)來將該行標記為已讀

因為某人或某物(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 編碼讀取文件。

我很感激你的回答!!

編輯: ##############

這段代碼可以解決問題......

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

但是對於我的用法,不建議閱讀所有行,因為這些人可能在接下來的 20 年中永遠不會刪除任何數據。

我將進一步逐行尋找解決方案...

您的代碼中存在一些問題,我將在這里嘗試解決

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);
}

現在您只需要弄清楚在哪里以及如何保存文件的位置。

如果您有一個寫入器將數據附加到文件中,隨着時間的推移,該文件可能會變得很大,也許最好在讀取文件后截斷或刪除該文件。 我建議刪除該文件,因為您不必遍歷大量空文件,但是這將要求您在處理文件之前重命名/移動文件,以避免編寫器進程在您關閉它之后但在您之前將數據附加到它刪除它。 如果您只是將文件移動到子文件夾,則可以將其用作備份。

我現在的解決方案是創建一個新文件,寫入該文件,刪除原始文件並重命名新文件。

        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。

謝謝你們的幫助!! 我很感激 !

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM