将模型导出到没有列名或标题的文本文件(仅值)

Posted

技术标签:

【中文标题】将模型导出到没有列名或标题的文本文件(仅值)【英文标题】:Export model to text file with out column names or headers(only values) 【发布时间】:2019-04-02 07:24:30 【问题描述】:

我有一个 DTO(数据传输对象)对象作为模型,其中包含来自收到的响应的数据。我只需要将标题/列下的值导出到文本文件。不需要导出列名或标题。我可以在XmlSerializer 的帮助下以 XML 格式导出数据。但找不到任何文本序列化程序。 我的模型如下:

public class ResponseGradeDto
    
        [XmlIgnore]
        [XmlElement(ElementName = "GRADEID")]
        public Guid Id  get; set; 
        [XmlElement(ElementName = "GRADENAME")]
        public string Name  get; set; 
        [XmlElement(ElementName = "GRADECODE")]
        public string Code  get; set; 
        public List<GradeQualitySpecDto> QualitySpecItem  get; set; 


我试过下面的代码:

System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(responseGradeDto.GetType());

            using (StringWriter textWriter = new StringWriter())
            
                xmlSerializer.Serialize(textWriter, responseGradeDto);
                string a = textWriter.ToString();
                return textWriter.ToString();
            

假设我的模型如下:



        "name": "My Name",
        "code": "1234",
        "information": "My Info",
        "gradeQualitySpecItem": [
        
            "propertyid": "100",
            "propertyname": "PropertyName1",
            "target": 10,
            "sigma": 20
        ,
        
            "propertyid": "200",
            "propertyname": "PropertyName2",
            "target": 10,
            "sigma": 30
        ]

我需要在文本文件中输出如下:

AL300 SAMPLE(Some hard coded text)
My Name
1234
My Info
PROP-SUMMARY
100
PropertyName1
10
20
PROP-SUMMARY
200
PropertyName2
10
30
end AL300 SAMPLE(end of file)

如果它是列表,我将在列表的输出下方。 任何人都可以帮助我吗?

【问题讨论】:

【参考方案1】:

没有内置的“纯文本”序列化程序将对象属性值序列化为行分隔文本。大多数情况下,当您想将对象保存为文本时,您只需编写代码即可。

例子:

var x = new ResponseGradeDto 
        Id = Guid.NewGuid(), 
        Name = "Foo",
        Code = "Cde",
        Information = "No info"
;

using (var writer = new StreamWriter(@"C:\temp\log.txt"))

    writer.WriteLine(x.Name);
    writer.WriteLine(x.Code);
    writer.WriteLine(x.Information);

不过,更通用的方法是使用反射来获取对象的所有引用属性:

var properties = typeof(ResponseGradeDto).GetProperties();

然后将属性转储到文件中可以很简单(注意我使用上面代码中定义的对象x):

File.WriteAllLines(@"C:\temp\attr.txt", properties.Select(p => p.GetValue(x).ToString()));

如果您愿意,您可以使用带有上述反射解决方案的属性来过滤掉想要/不需要的属性。这里我重用了您在示例中使用的“Xml 属性”,您可以编写自己的属性:

var properties = typeof(ResponseGradeDto).GetProperties().Where(
                    prop => Attribute.IsDefined(prop, typeof(XmlElementAttribute))
                        && !Attribute.IsDefined(prop, typeof(XmlIgnoreAttribute))
            );

希望这会有所帮助!

【讨论】:

非常感谢。它工作完美。但我在同一个 DTO 中有一个列表,它呈现为System.Collections.Generic.List``1[LQMS.API.Master.DTOs.Grade.GradeQualitySpecDto]。如果您能在这方面帮助我,将会很有帮助。 我已经更新了我的问题并在 Dto 中添加了列表。结构很安静。 你想如何输出列表?请将列表添加到您的示例输出中。 我可以通过 for 循环读取列表,但想知道您是否知道任何有效的方法。

以上是关于将模型导出到没有列名或标题的文本文件(仅值)的主要内容,如果未能解决你的问题,请参考以下文章

使用 bcp 实用程序和 SQL Server 2008 将表导出到带有列标题(列名)的文件

如何通过api将文本文档(ODT或DOCX)中的表格导出为EMF格式

怎样用文本文档写命令脚本文件? 有例子最好

如何将文本文档表示为特征向量进行文本分类?

将 textFields/textArea 写入文本文件

什么是在 Access 2003 中将带有填充空格的文本字段导出到 txt 文件的解决方案或公式