Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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#_Text_Delimiter - Fatal编程技术网

C# 定界格式

C# 定界格式,c#,text,delimiter,C#,Text,Delimiter,在stackoverflow上的任何位置都找不到这个,所以它是这样的: 我有一个文件,我想知道它是用管道(|)还是逗号(,)分隔的。我还想知道文本限定符是引号(“)还是什么都没有。有人有任何C#函数可以这样做吗?谢谢!获取第一行(或者第二行,如果第一行是带有文件名的头) 然后您可以使用正则表达式检查可能的格式 Regex rePipesAndQualifier = ("[^|"]*"|); 如果rePipesAndQualifier.match(yourFileLine);返回多个非空匹配项

在stackoverflow上的任何位置都找不到这个,所以它是这样的:

我有一个文件,我想知道它是用管道(|)还是逗号(,)分隔的。我还想知道文本限定符是引号(“)还是什么都没有。有人有任何C#函数可以这样做吗?谢谢!

获取第一行(或者第二行,如果第一行是带有文件名的头)

然后您可以使用正则表达式检查可能的格式

 Regex rePipesAndQualifier = ("[^|"]*"|);
如果
rePipesAndQualifier.match(yourFileLine);
返回多个非空匹配项,则您知道它使用管道作为分隔符,并具有分隔符

char[] delims = { '|', ',', ... };
再做一些正则表达式来检查逗号分隔的、带和不带限定符的


它取决于你期望得到的(所有分隔的,只有字符串分隔的)和你所知道的(分隔符是在终止和结束,或者只有在中间,字段的数目等等)。。这就是为什么我不能给你一个精确的解决方案。

这是我的想法,假设文件的列数相等,并且你有一个可能作为分隔符的字符列表

char[] delims = { '|', ',', ... };
取行的一个子集,如果足够小,则取整个文件,并将其存储在字符串数组中

string[] lines = text.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
循环使用分隔符,将使用该分隔符的拆分条目的计数插入整数数组:

int[] counts = lines.Select(s => s.Split(currentDelimiter).Length).ToArray();

使用您自己的方法查看所有计数是否彼此相等且均大于1。您使用的分隔符就是要使用的分隔符。

对于这样的文本分隔文件,我发现是一个非常有用的工具。(您可以导入visual basic dll以在C#应用程序中使用它)


我将使用的一般策略是,根据您的说法,每个文件有固定数量的列,选择一个分隔符并继续分析/读取行,直到一行的列数与前一行的列数不同。如果出现这种情况,请切换到另一个分隔符(如果两个分隔符都无效,则不确定要执行什么操作)。如果在第一行中根本找不到分隔符,您可能还希望抛出它。使用设置为true的
TextFieldParser
,您可以正确处理以引号转义的字段(如果不使用引号,它仍然可以正常工作)。这比在使用常规字符串操作时尝试手动处理引号要容易得多。

发现使用了什么分隔符?您想到了什么启发方法?基本上是搜索字符串,并尝试对其进行解析,然后将分隔符放入某个字符或字符串中。您是否知道有关数据的任何信息,例如每个字符串的项数行?你是指任何任意文件吗?你对这些文件了解多少?选择一个分隔符,并计算它在大量行中出现的次数。如果它总是与列数出现相同的次数,那可能是你的分隔符。如果另一个分隔符给你相同的结果,你就完蛋了。如果两个分隔符都没有出现r给出此结果时,您需要应用更多假设。以管道分隔的文件可以有带逗号的字段,而以逗号分隔的文件可以有带管道的字段。存在[单独]什么都不告诉你。如果什么都有,而你没有外部信息,那就用水晶球。说真的,一定有你事先知道的东西。是的,这就是为什么我们问OP他知道什么,或者他想根据什么来做决定,而不是自己挑选一些我们不知道会有用的东西。为了建议使用有意义的算法,在OP发布的内容之上确实需要额外的信息。正如@Servy所评论的,您回答时没有任何此类信息。您知道您有一个文件,每行的列数相等,除了您什么都不知道:它的管道或逗号分隔,它可能有一个文本限定符无论是否为fier,您都知道每一行的列数都是相同的。这里有太多的假设。OP没有提供足够的详细信息来制定答案-只是猜测。许多以逗号/管道分隔的列表在每一行中的项数并不相同,您还需要考虑到某些分隔符可能是in字符串限定符的ide,这对您的计数是个问题。很好的观点,@Servy。这可能是