繁体   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