0

似乎在stackoverflow上的任何地方都找不到这个,所以就这样:

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

4

3 回答 3

1

这不是我的想法,假设文件具有相同数量的列,并且您有一个可能是分隔符的字符列表。

char[] delims = { '|', ',', ... };

取行的子集,或者如果文件足够小,则取整个文件,并将它们存储在字符串数组中。

string[] lines = text.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);

循环遍历分隔符,将使用该分隔符的拆分条目计数插入到整数数组中:

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

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

于 2012-05-07T18:05:14.227 回答
1

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

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

于 2012-05-07T18:21:01.423 回答
0

获取第一行(或第二行,如果第一行是带有文件名的标题)。

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

 Regex rePipesAndQualifier = ("[^|"]*"|);

如果rePipesAndQualifier.match(yourFileLine);返回多个非空匹配项,则您知道它使用管道作为分隔符并具有分隔符。

制作更多正则表达式来检查逗号分隔以及有无限定符。

这取决于您期望获得的内容(全部分隔,仅分隔字符串)和您知道的内容(分隔符在开头和结尾或仅在中间,字段数等等)。这就是为什么我不能给你一个确切的解决方案。

于 2012-05-07T18:01:53.103 回答