我有一些非常蹩脚的Csv文件我需要解析.我正在使用CsvHelper,它工作得很棒.除了我有一些行有空格的地方,我有一个双倍的正常.
文件:
文本,SomeDouble,MoreText
"好",1.23 "好"
"坏","坏"
如果我尝试将其映射到
public class Test
{
[CsvField(Name = "Text")]
public string Text { get; set; }
[CsvField(Name = "SomeDouble")]
public double? SomeDouble{ get; set; }
[CsvField(Name = "MoreText")]
public string MoreText{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我得到这样的错误:
CsvHelper.CsvReaderException:尝试读取类型记录时发生错误
行:'2'(从1开始)
场指数:'1'(基于0)
字段名称:'SomeDouble'
场地价值:''
System.Exception:不是Double的有效值.---> System.FormatException:输入字符串的格式不正确.
处于System.ComponentModel.DoubleConverter.FromString(String value,NumberFormatInfo formatInfo)的System.Number.ParseDouble(String value,NumberStyles options,NumberFormatInfo numfmt),位于System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context,CultureInfo culture,Object value) - - 内部异常堆栈跟踪的结束---在lambda_method的System.ComponentModel.NullableConverter.ConvertFrom(ITypeDescriptorContext context,CultureInfo culture,Object value)处的System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context,CultureInfo culture,Object value)处闭包,ICsvReader)在CsvHelper.CsvReader.d__0`1.MoveNext()
在我看来,我的选择是创建一个自定义解析器,或将我的值映射到字符串属性并在那里进行解析.
还有其他选择吗?
如果我可以配置我想将空格视为空,那将是很好的.
根据要求,这是一个重现问题的代码示例
static class Program
{
public class Test
{
[CsvField(Name = …Run Code Online (Sandbox Code Playgroud) 我想知道Josh Close的CsvHelper是否有任何配置我缺少将值转换为null.我是这个库的忠实粉丝,但我一直认为应该有某种配置让它知道你的文件中什么值代表NULL.一个例子是一个值为"NA","EMPTY","NULL"等的列.我确信我可以创建自己的TypeConverter,但我希望有一个更简单的选项来设置配置中的某个位置对于我遇到的文件,这往往相当普遍.
是否有相对容易的配置设置?
我在CsvHelper.TypeConversion命名空间中找到了TypeConversion,但我不知道在哪里应用这样的东西或正确用法的例子:
new NullableConverter(typeof(string)).ConvertFromString(new TypeConverterOptions(), "NA")
Run Code Online (Sandbox Code Playgroud)
我也在使用最新版本2.2.2
谢谢!
我有一个带有两行的csv文件,第一行是标题行,其中包括36列分隔 ,
第二行是值,它们是由36分隔的值 ,
我想阅读第二行,我发现所有人都在谈论csvHelper包,所以我下载它,但它没有任何dll添加到我的项目中.
我的问题是如何包含它以及如何阅读第二行.
我知道我可以使用它安装它,Install-Package CsvHelper但我不希望这样,因为我想在服务器上部署此应用程序.因此,我更喜欢如果有某种方式add reference或类似的东西.
如果我知道如何包含它,阅读第二行并不难.我会做这样的事情:
,.我正在尝试将上传的csv文件转换为对象,以便可以保存在db中。在控制器中,我正在使用CsvHeler
但是看起来这只有在我首先保存文件并从中读取时才有效。CsvHelper无法直接从内存流中处理文件内容。在第一个GetRecords下面的代码中返回空
[HttpPost]
[Route(ApiRoutes.EodVariationMarginPlugs)]
public async Task<IActionResult> UploadPlugAsync(IFormFile filePayload)
{
if (filePayload.Length > 0)
{
using (var stream = new MemoryStream())
{
filePayload.CopyTo(stream);
using (var reader = new StreamReader(stream))
using (var csv = new CsvReader(reader))
{
csv.Configuration.RegisterClassMap<EodVariationMarginPlugMap>();
csv.Configuration.MissingFieldFound = null;
var records = csv.GetRecords<EodVariationMarginPlug>().ToList(); // record count is 0
foreach (var p in records)
{
p.CreatedAt = DateTimeOffset.Now;
p.CreatedBy = HttpContext.User.Identity.Name;
}
await _repository.InsertPlugsAsync(records);
}
}
var fileName = ContentDispositionHeaderValue
.Parse(filePayload.ContentDisposition)
.FileName.ToString().Trim('"');
var path = Path.Combine(Path.GetTempPath(), fileName);
using (var fileStream …Run Code Online (Sandbox Code Playgroud) CSVHelper我正在尝试使用nuGet 包创建 csv 文件
这是代码
public ActionResult Test()
{
var ms = new MemoryStream();
var sr = new StreamWriter(ms);
var csv = new CsvWriter(sr);
csv.WriteField("sd");
csv.WriteField("sd");
csv.WriteField("sd");
csv.WriteField("sd");
//ms.Seek(0, 0);
sr.Flush();
//ms.Position = 0;
var len = ms.Length;
return File(ms, "text/csv", "test.csv");
}
Run Code Online (Sandbox Code Playgroud)
但是,该文件始终为空
我在这里读到了几个问题,表明StreamWriter需要冲洗。位置移动到0。但是,我已经尝试过,但似乎不起作用
我也尝试过与using的 语句相同的操作MemoryStream,StreamWriter并且CSVWriter
我已经尝试了所有这些,但它仍然是空白
而且, 的长度MemoryStream始终为零
我究竟做错了什么?
我希望能够遍历CSV文件中的所有记录,并将所有好的记录添加到一个集合中,并分别处理所有“坏的”记录。我似乎无法做到这一点,我想我一定很想念。
如果我尝试捕获BadDataException,则后续读取将失败,这意味着我无法继续读取该文件的其余部分-
while (true)
{
try
{
if (!reader.Read())
break;
var record = reader.GetRecord<Record>();
goodList.Add(record);
}
catch (BadDataException ex)
{
// Exception is caught but I won't be able to read further rows in file
// (all further reader.Read() result in same exception thrown)
Console.WriteLine(ex.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
讨论的另一个选项是设置BadDataFound回调操作来处理它-
reader.Configuration.BadDataFound = x =>
{
Console.WriteLine($"Bad data: <{x.RawRecord}>");
};
Run Code Online (Sandbox Code Playgroud)
但是,尽管称为回调,但不良记录仍然会出现在我的“良好列表”中
在将其添加到列表之前,有什么方法可以查询读者以查看记录是否良好?
对于此示例,我的记录定义为-
class Record
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age …Run Code Online (Sandbox Code Playgroud) 我有一个 CSV 文件,我正在尝试解析它,但是在 int 数据类型列上出现以下错误。在文件中,我传递了该列的空白或空值。
[AutoMap(typeof(Test))]
[FileEntity("Test")]
public class TestFileEntity : BaseFileEntity
{
[CsvFileColumn(1)]
public int TestId { get; set; }
}
public IEnumerable<BaseFileEntity> Parse(Stream masterData, Type entityType, out IEnumerable<MasterDataFileParserError> errors)
{
var list = new List<BaseFileEntity>();
var errorList = new List<MasterDataFileParserError>();
try
{
using (var reader = new StreamReader(masterData))
{
var parser = new CsvReader(reader, new CsvHelper.Configuration.Configuration
{
HasHeaderRecord = true,
HeaderValidated = null,
MissingFieldFound = null
});
list.AddRange(parser.GetRecords(entityType).Cast<BaseFileEntity>());
}
}
catch (Exception ex)
{
if (ex.Data == null …Run Code Online (Sandbox Code Playgroud) 我使用CSVMapper输出字典中的对象:
using (TextWriter writer = new StreamWriter($"somefile.csv"))
{
var csvDP = new CsvWriter(writer);
csvDP.WriteHeader<NodeDPCount>();
csvDP.NextRecord();
foreach (NodeDPCount dpItem in dp.Values)
{
csvDP.WriteRecord(dpItem);
csvDP.NextRecord();
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的类,包含ID,Name,Age等字段.
但是,列的输出是我不喜欢的顺序(例如,ID不是第一个),我想指定哪个列是第一个,第二个,等等.
我相信我必须使用Mapping类,但是从文档中我无法弄明白.我希望能像课堂上的注释一样简单,但我猜不是.
有人可以帮忙吗?
谢谢.
我必须使用(即我无法控制)csv文件,其中“ N / A”是“应该”为整数的字段的可能值,并且我一直在尝试找出如何“滚动自己的” TypeConversion类来处理此问题,但未能找到示例。Josh的例子页面在这一特定领域明显缺乏和最近的计算器的问题,我已经能够找到的是这个从2013年。
然后,我找到了对NullValuesAttribute的引用,这似乎正是我所需要的,但是后来却不知道如何使用它。VisualStudio的Intellisense也无济于事。:)
理想情况下,我希望将“ N / A”转换为0(零)。有人可以帮忙吗?
在人们告诉我“好吧,很明显...”之前,我应该说这是我的第一个C#程序(从字面上讲,除了教程),而且还有一个时间因素-否则我会很开心地自己探索。
[更新:在CsvHelper中尝试了顶级自适应解决方案,从String解析布尔值 ]
因此,以上述问题的解决方案为起点,我这样做了:
static void Main()
{
var rows = new List<Job>();
using (var reader = new StreamReader("mydatafile.csv")
using (var csv = new CsvReader(reader))
{
csv.Configuration.RegisterClassMap<JobMap>();
while (csv.Read())
{
var record = new Job
{
JobId = csv.GetField<int>("Job ID"),
ItemCount = csv.GetField<int>("Item Count")
};
rows.Add(record);
}
}
}
public class Job
{
public int JobId { get; set; }
public int ItemCount { get; …Run Code Online (Sandbox Code Playgroud) 我正在使用CsvHelper将CSV文件读取到Dynamic C#对象中,并且想要迭代List<dynamic>using foreach并获取属性名称和值。
FileInfo file = new FileInfo("C:\\Temp\\CSVTest.csv");
List<dynamic> dynObj;
using (var reader = new StreamReader(file.FullName))
using (var csv = new CsvReader(reader))
{
dynObj = csv.GetRecords<dynamic>().ToList();
foreach (var d in dynObj)
{
var properties = d.GetType().GetProperties();
foreach (var property in properties)
{
var PropertyName = property.Name;
var PropetyValue = d.GetType().GetProperty(property.Name).GetValue(d, null);
}
}
}
Run Code Online (Sandbox Code Playgroud)
var properties = d.GetType().GetProperties(); 总是返回0,但是我可以在调试时看到有属性。
CSV文件包含以下数据:
Id,Name,Barnd
1,one,abc
2,two,xyz
Run Code Online (Sandbox Code Playgroud)