我正在使用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年的任何数据。
我会进一步逐行找到解决方案...
答案 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。
谢谢你们的帮助!!我很感激!