如何读取一行并写入文本文件的那一行?

时间:2017-09-07 06:28:09

标签: c# csv c#-4.0

我正在使用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编码读取文件。

感谢您的回答!

编辑:##############

这段代码可以解决问题......

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

但是对于我的使用,不建议阅读所有行,因为这些人可能永远不会删除未来20年的任何数据。

我会进一步逐行找到解决方案...

2 个答案:

答案 0 :(得分: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);
}

现在您只需要找出保存文件位置的位置和方法。

如果您有一个将数据附加到文件的编写器,文件可能会随着时间的推移而变大,那么最好在读取文件时截断或删除该文件。 我建议删除该文件,因为您不必循环遍历大量空文件,但是需要在处理文件之前重命名/移动文件,以避免编写进程在关闭文件之后但在您之前向其附加数据删除它。 如果您只是将文件移动到子文件夹,则可以将其用作备份。

答案 1 :(得分: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。

谢谢你们的帮助!!我很感激!