我正在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相关问答推荐

Azure管道-使用.NET 8 RC2 SDK生成C#项目失败

CLR如何在后台优化布尔比较操作?

如何查询 DOTNET_CLI_TELEMETRY_OPTOUT 是否永久设置为 TRUE?

如何确定计时器是否正在运行?

xunit Assert.ThrowsAsync() 不能正常工作?

单击关闭按钮时隐藏表单而不是关闭

如何将浮点数向上舍入到 C# 中最近的 int?

一种消耗(所有字节)BinaryReader 的优雅方式?

通用枚举到int的C#非装箱转换?

File.ReadAllLines() 和 File.ReadAllText() 有什么区别?

如何在 C# 中将 HTML 转换为文本?

在 C# 中转义命令行参数

如何在我的 C# 程序的面板中运行另一个应用程序?

List 和 IEnumerable 的实际区别

何时何地使用 GetType() 或 typeof()?

清除文件内容

判断对象列表是否包含具有特定值的属性

为什么要使用 C# 类 System.Random 而不是 System.Security.Cryptography.RandomNumberGenerator?

在构建事件命令行中放置注释的正确方法?

从不同程序集中的类名中解析类型