我正在查看我的分隔文件(例如CSV,tab分离等)解析选项,一般基于MS堆栈,特别是.net.我排除的唯一技术是SSIS,因为我已经知道它不能满足我的需求.
所以我的选择似乎是:
我有两个必须符合的标准.首先,给定以下文件,其中包含两个逻辑数据行(以及共五个物理行):
101, Bob, "Keeps his house ""clean"".
Needs to work on laundry."
102, Amy, "Brilliant.
Driven.
Diligent."
解析后的结果必须产生两个逻辑"行",每行包含三个字符串(或列).第三行/列字符串必须保留换行符!换句话说,由于"未闭合"文本限定符,解析器必须识别行何时"继续"到下一个物理行上.
第二个标准是每个文件的分隔符和文本限定符必须是可配置的.以下是两个字符串,取自不同的文件,我必须能够解析:
var first = @"""This"",""Is,A,Record"",""That """"Cannot"""", they say,"","""",,""be"",rightly,""parsed"",at all";
var second = @"~This~|~Is|A|Record~|~ThatCannot~|~be~|~parsed~|at all";
Run Code Online (Sandbox Code Playgroud)
正确解析字符串"first"将是:
'_'仅表示捕获了空白 - 我不希望出现文字下划线.
可以对要解析的平面文件做出一个重要的假设:每个文件将有固定数量的列.
现在深入了解技术方案.
正则表达式
首先,许多响应者评论说正则表达式"不是实现目标的最佳方式".但是,我确实找到了一位提供优秀CSV正则表达式的评论者:
var regex = @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))";
var Regex.Split(first, regex).Dump();
Run Code Online (Sandbox Code Playgroud)
应用于字符串"first"的结果非常精彩:
如果清除报价会很好,但我可以轻松地将其作为后处理步骤来处理.否则,此方法可用于解析样本字符串"first"和"second",前提是相应地修改了正则表达式和管道符号.优秀!
但真正的问题与多线标准有关.在将正则表达式应用于字符串之前,我必须从文件中读取完整的逻辑"行".不幸的是,我不知道要读取多少物理行来完成逻辑行,除非我有一个正则表达式/状态机.
所以这成了"鸡与鸡蛋"的问题.我最好的选择是将整个文件作为一个巨大的字符串读入内存,让正则表达式排序多行(我没有检查上面的正则表达式是否可以处理).如果我有一个10 gig文件,这可能有点不稳定. …
我看了一下网站和谷歌,但我似乎无法找到一个很好的解决方案,我正在尝试做什么.
基本上,我有一个客户端服务器应用程序(C#),我向服务器发送一个SQL select语句(连接到SQL Server 2008),并希望以CSV方式将结果返回给客户端.
到目前为止,我有以下内容:
if (sqlDataReader.HasRows)
{
while(sqlDataReader.Read())
{
//not really sure what to put here and if the while should be there!
}
Run Code Online (Sandbox Code Playgroud)
}
不幸的是,我真的很想将C#与SQL连接起来.我需要有关如何简单地将结果放在csv格式的字符串中的任何提示.列和字段可能会有所不同,所以我不能像在一些网站上看到的那样使用某种东西的方法.我不确定我是否可以理解了!
我非常感谢有关如何解决这个问题的任何提示/要点!