我正在try 解析字段为DateTime的记录,但FileHelpers没有使用我提供的格式.以下是一个应该解析记录但抛出错误的F#脚本.我认为这个问题与它是一个F#脚本有关,因为当我在.fsproj中使用它并在dotnet run中运行它时,这段代码可以正常工作.

#r "nuget: FileHelpers, 3.5.1"

open System
open FileHelpers

[<DelimitedRecord(","); IgnoreFirst; CLIMutable>]
type RateRecord =
    {
        [<FieldConverter(ConverterKind.Date, "yyyy-MM-dd hh:mm")>]
        DateTime : DateTime
        Value : float
    }
  
let sampleData = """DateTime,Value
2020-02-01 00:00,259
2020-02-01 00:01,267
2020-02-01 00:02,270"""

let engine = FileHelperEngine<RateRecord>()
let values = engine.ReadString sampleData

运行脚本的输出.错误消息在末尾.注意,错误消息说它试图使用'ddMMyyyy'格式,这不是我指定的格式.

> #r "nuget: FileHelpers, 3.5.1"
-
- open System
- open FileHelpers
-
- [<DelimitedRecord(","); IgnoreFirst; CLIMutable>]
- type RateRecord =
-     {
-         [<FieldConverter(ConverterKind.Date, "yyyy-MM-dd hh:mm")>]
-         DateTime : DateTime
-         Value : float
-     }
-
-
- let sampleData = """DateTime,Value
- 2020-02-01 00:00,259
- 2020-02-01 00:01,267
- 2020-02-01 00:02,270"""
-
- let engine = FileHelperEngine<RateRecord>()
- let values = engine.ReadString sampleData
- ;;
[Loading C:\Users\mcrews\AppData\Local\Temp\22000--4251218c-2322-40be-9ae7-fce17ffe54c3\Project.fsproj.fsx]
namespace FSI_0012.Project

FileHelpers.ConvertException: Error Converting '2020-02-01 00:00' to type: 'DateTime'.  There are more chars in the Input String than in the Format string: 'ddMMyyyy'
   at FileHelpers.Converters.DateTimeConverter.StringToField(String from)
   at FileHelpers.FieldBase.AssignFromString(ExtractedInfo fieldString, LineInfo line)
   at FileHelpers.FieldBase.ExtractFieldValue(LineInfo line)
   at FileHelpers.RecordOperations.StringToRecord(Object record, LineInfo line, Object[] values)
   at FileHelpers.FileHelperEngine`1.ReadStreamAsList(TextReader reader, Int32 maxRecords, DataTable dt)
   at FileHelpers.FileHelperEngine`1.ReadStream(TextReader reader, Int32 maxRecords)
   at FileHelpers.FileHelperEngine`1.ReadString(String source, Int32 maxRecords)
   at FileHelpers.FileHelperEngine`1.ReadString(String source)
   at <StartupCode$FSI_0013>.$FSI_0013.main@() in d:\Documents\GitHub\Scratchpad\FileHelpers\Test.fsx:line 158
Stopped due to error
>

推荐答案

看起来这与F#Interactive中对.NET Core的支持有关.假设您使用的是Visual Studio,如果您在工具和>选项中关闭了"使用.NET核心脚本",脚本将按预期工作:

Set to False

输出:

Microsoft (R) F# Interactive version 12.0.4.0 for F# 6.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

...

val values: RateRecord[] =
  [|{ DateTime = 2/1/2020 12:00:00 AM
      Value = 259.0 }; { DateTime = 2/1/2020 12:01:00 AM
                         Value = 267.0 }; { DateTime = 2/1/2020 12:02:00 AM
                                            Value = 270.0 }|]

问题是,当启用.NET核心脚本时,FieldConverter属性被忽略.我猜这是由FileHelpers的构建方式和/或.NET核心脚本中的问题造成的,这会导致反射错误(可能是不同版本的.NET之间在汇编格式上的细微不兼容),但我不能肯定.如果我了解到更多,我会更新的.

.net相关问答推荐

使用CLR将数据从Excel导入SQL Server时出错

标签从右向左增长

在安全处理异常时避免首次机会异常消息

在 C# 中使用委托

我应该在 LINQ 查询中使用两个where子句还是&&?

System.String.Copy 在 .NET 中有什么用?

C# 测试字符串是否为整数?

.NET 中是否有可序列化的通用键/值对类?

在 .NET 中填充整数列表

返回 IList 是否比返回 T[] 或 List 更糟糕?

beforefieldinit 标志有什么作用?

接口属性的 XML 序列化

如何在 C# 中处理 XML

C# 应用程序中的全局键盘捕获

如果锁定的对象内部发生异常,它会保持锁定状态吗?

实体框架太慢了.我有哪些 Select ?

序列化一个可为空的 int

LINQ 可以与 IEnumerable 一起使用吗?

如何从 webclient 获取状态码?

为什么 IList 不支持 AddRange