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