我编写了一个名为“ blobsUploader”的程序,该程序每晚晚上11点将csv文件上传到blob容器。
每当一个新的csv文件到达blobs容器时,就会在名为“ blobsAdressQueue”的队列中显示一条新消息,其中包含新blob(csv文件)的地址。
这将引起Web作业,该作业读取csv文件并将其所有数据存储在名为“ myDataTable”的Azure表中。
整个过程运行良好,但是从过去的一两个月突然开始,每天晚上上传新的csv时,Web Job进程都会出错,并且“ blobsAddressQueue”消息将移至“ blobsAddressQueue-poison”,表示消息已超过向应用程序的最大传递尝试次数。
我现在从2018年6月上载了一个csv,可以肯定地工作了。 但是,现在带有该Blob地址的消息位于“ blobsAddressQueue-poison”中。
当我尝试其中一种并打开“切换输出”时,我得到的是: 这很奇怪,因为该文件是在2018年6月读取的!没有任何问题!从那以后,我没有更改代码或csv文件中的任何内容。
如果需要更多信息来回答问题,请告诉我。
答案 0 :(得分:1)
此问题与webjob无关,但与您引用的CsvHelper库有关。我检查了源代码,发现当一个字段包含引号并且该字段未加引号(转义)时,该字段将被视为错误数据。
源代码:
/// <summary>
/// Gets or sets the function that is called when bad field data is found. A field
/// has bad data if it contains a quote and the field is not quoted (escaped).
/// You can supply your own function to do other things like logging the issue
/// instead of throwing an exception.
/// Arguments: context
/// </summary>
Action<ReadingContext> BadDataFound { get; set; }
解决方案是
修改csv文件中的问题字段
或
通过将BadDataFound设置为null来忽略不良数据:
csv.Configuration.BadDataFound = null;
示例代码:
static void Main(string[] args)
{
using (var reader = new StreamReader(@"C:\Users\toml\Desktop\test.csv"))
using (var csv = new CsvReader(reader))
{
csv.Configuration.BadDataFound = null;
var records = csv.GetRecords<Foo>();
foreach(var item in records)
{
Console.WriteLine(item.Name);
}
}
Console.ReadKey();
}
}
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
无效的CSV示例:
Id,Name
1,one"
2,two
有效CSV样本:
Id,Name
1,"one""
2,two