Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分析大型文本文件,动态修改_C#_Csv_Stream_Real Time_Large Files - Fatal编程技术网

C# 分析大型文本文件,动态修改

C# 分析大型文本文件,动态修改,c#,csv,stream,real-time,large-files,C#,Csv,Stream,Real Time,Large Files,我需要实时解析一个大的CSV文件,而它正被另一个进程修改。总的来说,我的意思是在这一点上大约20GB,并且缓慢增长。应用程序只需要检测和报告数据流中的某些异常,对于这些异常,它只需要存储小的状态信息(O(1)space) 我在考虑每隔几秒钟轮询一次文件的属性(大小),打开一个只读流,查找到前面的位置,然后继续解析我第一次停止的位置。但由于这是一个文本(CSV)文件,我显然需要在继续时跟踪新行字符,以确保始终解析整行 如果我没有弄错的话,这不应该是一个要实现的问题,但是我想知道是否有一个通用的方法

我需要实时解析一个大的CSV文件,而它正被另一个进程修改。总的来说,我的意思是在这一点上大约20GB,并且缓慢增长。应用程序只需要检测和报告数据流中的某些异常,对于这些异常,它只需要存储小的状态信息(
O(1)
space)

我在考虑每隔几秒钟轮询一次文件的属性(大小),打开一个只读流,查找到前面的位置,然后继续解析我第一次停止的位置。但由于这是一个文本(CSV)文件,我显然需要在继续时跟踪新行字符,以确保始终解析整行

如果我没有弄错的话,这不应该是一个要实现的问题,但是我想知道是否有一个通用的方法/库已经解决了其中的一些问题


注意:我不需要CSV解析器。我需要有关一个库的信息,该库可以简化从正在动态修改的文件中读取行的过程。

这里有一个小问题:

  • 读取和解析CSV需要文本阅读器
  • 定位对文本阅读器不起作用
第一个想法:保持它打开。如果生产者和分析仪都在非独占模式下运行,则应可以读取行直到null、暂停、读取行直到null等


它应该是7位ASCII,只有一些GUID和数字


这使得跟踪文件位置(pos+=line.Length+2)成为可能。一定要用
Encoding.ASCII
打开它。然后,您可以将其作为普通二进制流重新打开,搜索到最后一个位置,然后将StreamReader附加到该流

为什么不在每次开始解析时剥离一个单独的进程/线程呢?这样,您就可以将并发(动态)部分从数据源移到数据接收器,所以现在您只需要了解如何从所有线程收集结果

这将意味着为每个线程重新读取整个文件,不过

您可以在这两个版本上运行一个diff程序,然后从中提取,这取决于csv数据源的格式有多好:它是否修改已经写入的记录?还是只是附加新记录?如果是这样,您可以将新内容(当前eof的最后位置)拆分为一个新文件,并在后台线程中轻松处理这些内容:

  • 轮询线程记住最后一个文件大小
  • 当文件变大时:从最后一个位置搜索到最后一个位置,保存到临时文件
  • 后台线程按照创建/修改的顺序处理所有剩余的临时文件

我没有测试它,但我认为您可以使用FileSystemWatcher来检测不同进程何时修改了您的文件。在已更改的事件中,您将能够搜索到以前保存的位置,并读取附加内容。

是否可以停止csv处理?如果是,我建议您将其转移到RDBMS。@Oybek:您能澄清一下吗?附加到文件的进程一直在运行,我需要不断逐行分析数据(延迟几秒钟)。我假设您无法控制发送文件的进程?我的意思是,如果处理CSV文件时可以脱机,如果可以花一点时间进行开发,那么您可以将持久存储从csv文件更改为数据库。后者有所有类型的工具(触发器、存储过程、作业),可以通知您任何更改,具有更高的一致性和并发性。我只想指出,CSV并不是设计为并发数据存储,它是一种轻量级的数据传输格式,就像json或xml。嗯,与整个文件大小相比,每秒追加的数据的大小相对较小,这就是为什么我希望避免每次读取它(经过一周的测量后,它可能很容易达到50GB)。由于数据只是附加的,而且文件非常大,所以diff是不实用的。我也不理解线程的部分:因为这是一个磁盘操作,读取不会从多个线程中受益,它可能只会运行得更慢,而且我将部分文件写入磁盘,然后再次打开它的步骤似乎也是多余的(如果我复制它,我还可以解析它)。