【发布时间】:2020-09-18 19:33:45
【问题描述】:
我有一个假设解析数据并使用“@BELL”作为分隔符的 C# 代码。 (BELL 是 ASCII 码)
但有些值的末尾有另一个“@”,因此它看起来像这样“0.0000000@SS-AA&-BB-C)@@021328@STRING_Price”。 CsvParser 确实在第一个“@”处分裂,但错过了第二次出现(它有“@@”)并在第三次出现时分裂得很好。 数据不能在源中修改,必须保持原样。
我们正在使用 CsvHelper v 15.0.0。
这是一个已知的 CsvParser 问题吗? (我试图在不添加额外解析/替换的情况下逃脱)。
这是我的代码(我已对其进行了简化并使用本地文件进行测试,但实际上它是转到 AzureBlobStorage):
private static readonly string delimiter = "@" + new string('\u0007', 1);
private static string filePath = "C:\\Downloads\\000_From_Blob";
private static IEnumerable<string[]> ParseCompressedClientFormattedStream(string filePath, string delimiter)
{
using (var remoteStream = File.OpenText(filePath))
{
using (var csvReader = new CsvParser(remoteStream, new CsvConfiguration(CultureInfo.InvariantCulture) { Delimiter = delimiter.ToString(), BadDataFound = null }))
{
for (; ; )
{
var line = csvReader.Read();
if (line != null) yield return line;
else break;
}
}
}
}
以下是源文件中的 2 行示例。第一行被正确解析。但是第二个没有在它有双“@”的地方分裂:
110@A778@10211@2@Joe@0.0000000@SS-AA&-BB-C)@@SS-AA&-BB-C)@021328@STRING_Price@$9.99@@False
111@A778@10211@2@Joe@0.0000000@SS-AA&-BB-C)@@@SS-AA&-BB-C)@@021328@STRING_Price@$9.99@@False
【问题讨论】:
-
是否可以将数据样本附加到问题中?
-
@YegorAndrosov 如何将文件附加到这个问题?我找不到它的选项。
-
顺便说一句,您可以将分隔符声明为
const string delimiter = "@\u0007";或const string Bell = "\u0007"; const string delimiter = "@" + Bell;。这样可以节省少量垃圾(一切都是 const,没有调用字符串构造函数,没有运行时字符串连接) -
我试图在要点中重现您的文件并使用您的代码,它给了我 14 单元数组,第二行的一些块末尾带有“@”。请检查一下。对我来说一切都很好gist.github.com/pwrigshi/…
-
如果你需要在第二种情况下有 16 个块,猜你必须先
.Replace("@@", "@BEL@")