FileHelpers库 - 在Transform上附加多个记录

时间:2011-02-23 22:17:55

标签: vb.net csv transform filehelpers

使用FileHelpers库在VB.NET中做一些很棒的事情。使用从文本文件模板构建的动态类解析文件。我找不到的一件事:一种读取单个记录并确定它应该导致生成两个记录的方法  现行守则:

Dim FromType As Type = Dynamic.ClassBuilder.ClassFromSourceFile(MyFilePath,MyDynamicTypeName,NetLanguage.VbNet)

Dim FromRecords()As Object FromRecords = FileHelpers.CommonEngine.ReadString(FromType,MyStringBuilder.ToString)

'...这里可能代码检查某些值

Dim engine As New FileTransformEngine(Of ITransformable(Of MyDestinationClass),MyDestinationClass)

'理想情况下,在下一行中,我希望它能够看到某些条件并能够从单个源代码行生成两条记录。 Dim PayRecords()As Object = engine.TransformRecords(FromRecords)

或者,如果有办法实现“ITransformable(Of ...”TransformTo()并让它返回多个记录,我可以将逻辑放在动态类定义TransformTo()方法中。

思想?

以下是我的源动态类的示例:

导入FileHelpers'永远不要忘记

_ Public NotInheritable Class MyDynamicClass     实现IT可变形(MyDestinationClass)      _     公共名称为字符串

<FieldQuoted(""""c, QuoteMode.OptionalForRead, MultilineMode.AllowForRead)> _
Public KeyType As String

Public Hours As Double

Public Function TransformTo()As MyDestinationClass实现ITransformable(Of MyDestinationClass).TransformTo         Dim res为New MyDestinationClass

    res.ContactName = Name
    ' Here is where I would like to say... instead of Return res
    If KeyType="ABCD" Then
        Dim newRes as New MyDestinationClass
        newRes.Contactname = Name + " 2nd contact"

        Dim resArray() as MyDestinationClass
        redim resArray(1)
        resArray(0) = res
        resArray(1) = newRes
    End If
    Return resArray
    ' Or alternately refer to the engine, but it is not in scope for the dynamic record (is it?). Something like...
    engine.AppendToDestination(new MyDestinationClass(...))

结束功能 结束班

1 个答案:

答案 0 :(得分:0)

我认为你要遇到的主要问题是ITransformable.TransformTo()被指定返回一个T值。

当您调用engine.TransformRecords()时,会在循环中调用此方法,其中为每个输入记录添加一个输出记录。

如果您不介意使用自己的FileTransformEngine版本,我认为这不会是一个很大的改变,但我没有看到一个干净的方法来实现这一点。