似乎在stackoverflow上的任何地方都找不到这个,所以就这样:
我有一个文件,我想知道它是用管道(|)还是逗号(,)分隔的。我还想知道文本限定符是引号(“)还是什么都没有。有人有任何 C# 函数可以做到这一点吗?谢谢!
这不是我的想法,假设文件具有相同数量的列,并且您有一个可能是分隔符的字符列表。
char[] delims = { '|', ',', ... };
取行的子集,或者如果文件足够小,则取整个文件,并将它们存储在字符串数组中。
string[] lines = text.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
循环遍历分隔符,将使用该分隔符的拆分条目计数插入到整数数组中:
int[] counts = lines.Select(s => s.Split(currentDelimiter).Length).ToArray();
使用您自己的方法查看所有计数彼此相等并且都大于 1。您所在的分隔符就是要使用的分隔符。
对于像这样的文本分隔文件,我发现TextFieldParser是一个非常有用的工具。(您可以导入 Visual Basic dll 以在 C# 应用程序中使用它)。
我将使用的一般策略,因为根据您的说法,每个文件有固定数量的列,将选择一个分隔符并继续解析/读取行,直到一行的列数与前一行不同。当发生这种情况时,切换到另一个分隔符(如果两者都无效,不确定你想做什么)。如果在第一行根本找不到分隔符,您可能还想丢弃分隔符。使用TextFieldParser
HasFieldEnclosedInQuotes设置为 true,您可以正确处理在引号中转义的字段(如果不使用引号,它仍然可以正常工作)。这比在使用常规字符串操作时尝试手动处理引号要容易得多。
获取第一行(或第二行,如果第一行是带有文件名的标题)。
然后您可以使用正则表达式来检查可能的格式。IE
Regex rePipesAndQualifier = ("[^|"]*"|);
如果rePipesAndQualifier.match(yourFileLine);
返回多个非空匹配项,则您知道它使用管道作为分隔符并具有分隔符。
制作更多正则表达式来检查逗号分隔以及有无限定符。
这取决于您期望获得的内容(全部分隔,仅分隔字符串)和您知道的内容(分隔符在开头和结尾或仅在中间,字段数等等)。这就是为什么我不能给你一个确切的解决方案。