我是对象序列化的新手,在尝试弄清楚如何/在对象字段和CSV标头之间插入映射时遇到麻烦。
我目前正在创建CSV上传表单,并尝试使用CSVEncoder将CSV行反序列化为对象数组。
现在,当标头很完美时,这可以工作,但是我希望将某种标头映射添加到CSVEncoder中,以将标头映射到字段。
示例
class Person
{
public $name;
public $age;
public $email;
}
如下所示的CSV标头将完美地映射行
'name,age,email'
但是我想添加某种映射,以允许诸如此类的标头也映射到适当的字段
'full name,aged,email address'
参考: https://symfony.com/doc/current/components/serializer.html
也许我的谷歌搜索技能不是很好,因为我认为这在尝试反序列化CSV时很常见。
我确实有一个非序列化的版本,该版本可以读取文件并将行转换为对象,但是速度非常慢,我想通过“适当”的操作来改进此代码(以及我的技能)。
在另一个版本中,我读取了标题行,将其与映射正确标题和可接受别名的数组的关联数组进行比较,然后用适当的标题重写标题。
在将文件传递给CSVEncoder之前,我可以再次执行此操作,但我想知道是否有更好的方法来减轻这种麻烦。
欢呼
答案 0 :(得分:1)
您应使用NameConverter,选中此https://symfony.com/doc/current/components/serializer.html#converting-property-names-when-serializing-and-deserializing
因此,您的名称转换器可能如下所示:
<DataGrid x:Name="winDataTable" Grid.Row="2" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" HeadersVisibility="Column"
IsReadOnly="True" SelectionMode="Single" AutoGenerateColumns="True"
ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollBarVisibility="Auto"
ItemsSource="{Binding Path=SelectedFeatureDataTable, Mode=OneWay}">
,您应该这样使用它:
public DataTable SelectedFeatureDataTable
{
get
{
return _selectedFeaturesDataTable;
}
set
{
SetProperty(ref _selectedFeaturesDataTable, value, () => SelectedFeatureDataTable);
}
}
我没有测试代码,但是类似的东西应该可以工作:)