【发布时间】:2018-02-15 18:36:37
【问题描述】:
我正在使用 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 年内永远不会删除任何数据。
我会进一步逐行寻找解决方案...
【问题讨论】:
-
您可以创建一个 StreamReader,其编码类似于 new StreamReader(stream, Encodiing.UTF8)。但是你不能在文件中间添加一些东西,但是你可以覆盖数据。但也许最好保存您尚未读取的第一条记录的位置(在文件中),因为您的编写器仅将数据附加到文件中
-
@Casperah:我想保存第一个未读行的位置有点不一致。如何覆盖特殊位置的数据?
-
读取整个文件,更改要更改的行(在内存中),写回文件。如果文件太大而无法一口气读入内存,请一次读取一行并将该行写回新文件,然后再继续下一行
-
此外,您不能写入正在读取的同一文本文件。您也许可以诱使类同时打开文件进行读取和写入,但我可以向您保证,如果您做自己想做的事情,您将破坏您的文件。
标签: c# csv filestream streamreader streamwriter