C#将文本限定文件解析为单独的字符串

时间:2016-04-27 10:30:19

标签: c#

我尝试使用dotnet c#解析和拆分以下示例文本文件,以便将每个数据点拆分为单独的字符串。

§Id§|§Name§|§UpdateDate§|§Description§
1|§AAA/FE-45§|2000-02-02 00:00:00|§§
2|§BBB-123§|2000-02-03 00:00:00|§§
3|§CC|45§|2000-02-07 00:00:00|§The following,
is a multiline description
please check Name:
CC|45 as soon as possible§

文件属性:

CodePage: ANSI
Column Headers: Yes
Row Delimiter: {CR}{LF}
Column Delimiter: | (Vertical Bar)
Text Qualifier: §

我遇到的麻烦是文本类型列使用非标准符号限定,并且给定文本可能是多行文本块,可能包含各种符号,如{CRLF},{LF}或甚至| (垂直条)。

从我可以阅读的内容来看,我无法使用TextFieldParser,因为它只处理双引号限定符,而Bulk Insert不支持文本限定符。 我根本不是c#专家;我不想重新发明轮子,理想情况下想要使用最佳实践。但我也想了解和#34;拥有"我生产的东西,所以我宁愿避免像Filehelpers这样的库。 谢谢你的指导!

2 个答案:

答案 0 :(得分:1)

一种典型的方法是使用有限自动机。在您的情况下,您可以尝试以下代码:

    public static List<string[]> split(string s)
    {
        bool ins = false;
        int no = 3;
        var L = new List<string>();
        var Res = new List<string[]>();
        var B = new StringBuilder();
        foreach (var c in s)
        {
            switch (c)
            {
                case '§':
                    if (ins)
                    {
                        ins = false;
                        L.Add(B.ToString());
                        if (no == 0)
                        {
                            Res.Add(L.ToArray<string>());
                            L.Clear();
                            no = 3;
                        }
                    }
                    else
                    {
                        ins = true;
                        B.Clear();
                    }
                    break;
                case '|':
                    if (!ins) { no--; }
                    else B.Append(c);
                    break;
                default:
                    if (ins) B.Append(c);
                    break;
            }
        }
        return Res;
    }
}

答案 1 :(得分:0)

试试此代码

string pattern = @"(?<id>\d+) \| (?<name>§.+?§) \| (?<date>\d{4}-\d\d-\d\d \s \d\d:\d\d:\d\d) \| (?<desc>§.*?§)";
Regex regex = new Regex(pattern, RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline);

string text = File.ReadAllText("test.txt", Encoding.GetEncoding(1251));
text = text.Split(new string[] { Environment.NewLine }, 2, StringSplitOptions.None)[1];

var matches = regex.Matches(text);

foreach (Match match in matches)
{
    Console.WriteLine(match.Groups["id"].Value);
    Console.WriteLine(match.Groups["name"].Value.Trim('§'));
    Console.WriteLine(match.Groups["date"].Value);
    Console.WriteLine(match.Groups["desc"].Value.Trim('§'));
    Console.WriteLine();
}