我尝试使用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这样的库。 谢谢你的指导!
答案 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();
}