C# CsvHelper - 具有不同数量属性的记录

2024-04-04

我在遗留项目上使用 CsvHelper (版本 7.1.0 ,如果可能的话,我宁愿暂时保留该版本)

我有一个具有不同数量属性的对象列表,我想将其保存为 csv。

例如:

var list = new List<dynamic>(){
  {id=1, image1="xxx", state="ok"},
  {id=2, image1="xxx", image2=yyy, state="ok"}
  {id=3, image1="xxx", state="ok"}
}

编辑以澄清:我接收这些对象作为公开发布的 API 的一部分 客户可以决定发给我

{
  {id=1, image1="xxx", state="ok"},
  {id=2, image1="xxx", image2="yyy", state="ok"}
  {id=3, image1="xxx", state="ok"}
}

而另一个可以发送

{
  {id=1, MyImage1="xxx", state="ok"},
  {id=2, MyImage1="xxx", MyImage2="yyy", state="ok"}
  {id=3, MyImage1="xxx", MyComment="please discard", state="ok"}
}

这就是为什么我(至少我认为)需要使用某种动态或 ExpandoObject

最简单的情况是所有记录都具有相同的属性,但我遇到了特定边缘情况的问题


当我写的时候:

var csv = new CsvWriter(writer);
csv.WriteRecords(list);

标头基于列表中的第一项,因此在我的情况下,由于缺少某些标头,csv 会变得混乱,我会得到类似的内容:

id image1 state
1 xxx ok
2 xxx yyy ok
3 xxx ok

我想要的是以下内容:

id image1 image2 state
1 xxx ok
2 xxx yyy ok
3 xxx ok

我需要保持标题的顺序和列表的排序。

到目前为止,我拥有的最佳解决方案是识别具有最高属性计数的项目,并将具有空值的缺失属性添加到所有其他项目...

有没有更明智的方法来实现我的需求?

Thanks!


我让它工作的唯一方法是遍历所有记录并找到所有潜在的标头。然后循环遍历每个记录的标题列表以查看该记录是否包含标题。如果是,则写出该值,如果不是,则写一个空字段。

void Main()
{
    var records = new List<dynamic>(){
      new {id=1, image1="xxx", state="ok"},
      new {id=2, image1="xxx", image2="yyy", state="ok"},
      new {id=3, image1="xxx", state="ok"}
    };
    
    var headers = new List<string>();
    
    foreach (var type in records.Select(r => r.GetType()).Distinct())
    {
        var properties = type.GetProperties();
        var previousItem = string.Empty;
        
        foreach (var property in properties)
        {
            var previousItemIndex = headers.FindIndex(a => a == previousItem);          
            var currentItemIndex = headers.FindIndex(a => a == property.Name);
            
            if (currentItemIndex == -1)
            {
                headers.Insert(previousItemIndex + 1, property.Name);
            }
            
            previousItem = property.Name;
        }
    }
    
    using (var csv = new CsvWriter(Console.Out))
    {
        foreach (var header in headers)
        {
            csv.WriteField(header);
        }
        
        csv.NextRecord();
        
        foreach (var record in records)
        {
            foreach (var header in headers)
            {
                var property = record.GetType().GetProperty(header);
                
                if (property != null)
                {
                    csv.WriteField(property.GetValue(record, null));
                }
                else
                {
                    csv.WriteField(string.Empty);
                }
            }
            csv.NextRecord();
        }
    }
}

您可能需要更改获取标头顺序的逻辑。这在一定程度上取决于您对传入数据的了解。对于具有 name1、name2、name3 的一个可能的解决方案是查找前一项的最后一个索引,并删除所有数字。

var previousItemIndex = headers.FindLastIndex(a => a.Contains(string.Concat(previousItem.Where(char.IsLetter))));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# CsvHelper - 具有不同数量属性的记录 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框

随机推荐

  • 将新的 GUID 插入 Visual Studio 2012

    是否可以创建代码片段或类似的内容来自动生成 GUID 并将其插入到 Visual Studio 2012 中的文本编辑器中 我经常需要生成新的 GUID 例如 WiX 安装程序 以及我们自己的内部框架 我曾经使用宏来执行这项工作 创建一个新
  • 在python中生成任意长度的数字升序列表

    我可以调用一个返回升序数字列表的函数吗 IE function 10 会回来 0 1 2 3 4 5 6 7 8 9 你要range https docs python org 3 library functions html func r
  • EF6(代码优先)、MVC、Unity 和没有存储库的服务层

    我的应用程序使用 SQL Server 2012 EF6 MVC 和 Web API 它还使用存储库和各种文件 例如 DatabaseFactory cs Disposable cs IDatabaseFactory cs IReposit
  • WPF 显示/隐藏带有触发器的控件

    我是 WPF 新手 我尝试创建 xaml 逻辑来根据 ViewModel 上的 AllowMiscTitle 值显示 隐藏控件 xaml 由两个字段组成 一个标准图块的组合框 先生 女士 其他 当选择 其他 时 我希望显示文本框 我创建了以
  • 如何从 Ubuntu 连接到 Windows SQL Server

    在过去的两天里 我一直在尝试连接到远程 Windows SQL 服务器 但没有明显成功 我正在尝试使用 python 连接pyodbc包裹 我尝试关注所有与此相关的博客文章 但运气不佳 我首先关注了that http onefinepub
  • JSON 解析后小部件未更新

    我有以下代码 Override public void onReceive Context context Intent intent super onReceive context intent if CLOCK WIDGET UPDAT
  • 更新条目而不更新时间戳

    我在 mysql 表中有一个属性为 ON UPDATE CURRENT TIMESTAMP 的时间戳 有没有办法在特殊情况下手动禁用更新时间戳 例如 更新条目以修改博客文章 但不重新日期 您可以在更新命令中手动将列的值设置为其当前值 UPD
  • cmake add_custom_command 具有多个输出文件的问题

    我注意到在使用 cmake 时存在一些潜在的不正确行为add custom command和多个输出文件 我已经能够将问题隔离到一个最小的示例 见下文 看来当我在我的中指定了两个输出文件时add custom command 在某些情况下
  • WPF 绑定属性 Path 和 XPath 是否互斥?

    假设我有一个UserControl whose DataContext被设置为一个具有XmlDataProvider财产 我想在控件的 XAML 中绑定到此属性 并指定一些 XPath 我试过这个
  • Telerik RadGrid - 如何设置插入时的默认数据?

    当我单击 添加记录 按钮时 我希望其中一列具有默认值 我如何在后面的代码中做到这一点 这是一个动态日期并且可以随时更改 如果该列不是GridTemplateColumn 您可以使用列的指定默认值DefaultInsertValue属性 像这
  • Java:如何对两个对应的数组进行排序?

    我有两个数组 First array 25 20 50 30 12 11 Second Array New York New Jersey Detroit Atlanta Chicago Los Angeles 第二个数组中的每两个城市对应
  • 在 python pygame 中使用 cos() 和 sin() 以恒定速度从玩家发射粒子

    在 python pygame 中 我试图让我的玩家从玩家中心开始向鼠标方向发射粒子 class Particle def init self dx dy x y self dx dx self dy dy self x x self y
  • 对象类型和引用类型之间的区别

    我是从 Head First Java 中学习多态性并得出这个概念的 有人可以用例子解释一下吗 编译器检查引用类型的类 而不是对象类型 那么引用类型和对象类型有什么区别呢 我不认为他们对 对象类型 和 引用类型 的使用是标准化的 但这是我的
  • 无法将 ADT 插件安装到 Eclipse - “违反合同”错误消息

    昨天在Eclipse中安装ADT插件时遇到了找不到所需项目的问题 我通过打开下载站点列表并勾选列表底部的两个站点来解决这个问题 由于某种原因没有选择这两个站点 其中一个地址包含 mylyn 一词 现在 当 fetchingjavax xml
  • CMake 在 Windows 上找不到 wxWidgets

    我的 CMakeLists txt 中有以下代码片段 如中所述wxWidgets 维基 https wiki wxwidgets org CMake set wxWidgets ROOT DIR libs wxWidgets set wxW
  • 访问数据视图中过滤项目的列表

    我使用 DataView 来填充网格 并使用过滤器与可见行进行交互 我的问题是在应用过滤器后 行更改或行计数更改 我如何访问数据视图以仅迭代那些可见行 例如进行一些计算 因为行本身没有公开暴露 如果是的话 行并不总是数据元素 因为也可以引用
  • 向 ObservableCollection 添加元素会导致异常 Index was out of range

    我有一个代码 允许用户选择一个文件 将一些有关它的信息添加到可观察的集合中并显示上传进度 完成后 它将图像绑定到图像视图 它立即可以正常工作 但如果重复该过程 则会引发异常 System ArgumentOutOfRangeExceptio
  • 从 URL 添加图像到 PDF?

    我正在尝试将 URL 地址中的图像添加到我的 pdf 中 代码是 Image image Image getInstance http www google com intl en ALL images logos images logo
  • 我无法理解的Python print 行为

    我的代码片段如下所示 from time import sleep for i in xrange 10 status hello s str i status status chr 8 len status 1 sleep 1 print
  • C# CsvHelper - 具有不同数量属性的记录

    我在遗留项目上使用 CsvHelper 版本 7 1 0 如果可能的话 我宁愿暂时保留该版本 我有一个具有不同数量属性的对象列表 我想将其保存为 csv 例如 var list new List