如何将结构化文本文件转换为xml文件api

时间:2014-11-23 18:35:10

标签: c# .net xml csv

我有一个结构化的文本文件,每个信息都按其位置(偏移量)和长度定位,例如,这一行取自文本文件:

H00VLS1    1200    32D1    20140602080524WIRE SPEC DATA 

以下是提取数据的规则:

HEADER_ID        length(3)  offset(1)
PRODUCT_NO       length(15) offset(4)
SORT_FIELD       length(9)  offset(19)
SUFFIX           length(9)  offset(28)
PERSON_CODE      length(5)  offset(33)
PROCESS_DATE     length(8)  offset(38)
MAINTENANCE_DATE length(8)  offset(46)

最后,在应用此规则后,我们得到了这些数据:

HEADER_ID   PRODUCT_NO   SORT_FIELD   SUFFIX     PERSON_CODE   PROCESS_DATE   MAINTENANCE_DATE
H00         VLS1  1200   32D1         20140      60208         0607WIRE       SPEC DA

生成的xml文件:

<header>
<header_id>H00</header_id>
<product_no>VLS1  1200</product_no>
<sort_feild>32D1</sort_feild>
<suffix>20140</suffix>
<person_code>60208</person_code>
<process_date>0607WIRE</process_date>
<maintenance_date>SPEC DA</maintenance_date>
</header>

现在我的问题是有一个C#类或api根据长度和偏移规则将我的文本文件转换为xml或json文件?

2 个答案:

答案 0 :(得分:0)

使用FileHelpers处理您的文件,使用LINQ to XML将结果转换为XML。

答案 1 :(得分:0)

使用LINQ to XML

进行操作非常简单
    // Read txt file into an array of strings.
    string[] source = File.ReadAllLines(@"C:\mypath\text.txt");

    // Construct xml from above source file. Use helper method to split string.
    XElement cust = new XElement("Root",
        from str in source
        let fields = SplitLine(str)
        select new XElement("header",
            new XElement("header_id", fields[0]),
            new XElement("product_no", fields[1]),
            new XElement("sort_field", fields[2]),
            new XElement("suffix", fields[3]),
            new XElement("person_code", fields[4]),
            new XElement("process_date", fields[5]),
            new XElement("maintenance_date", fields[6])
            )
        );

您可以使用substring函数轻松拆分txt文件的每一行,偏移量为1,长度为索引:

public static string[] SplitLine(string str)
{
     string[] s = new string[7] { 
         str.Substring(0, 3),
         str.Substring(3, 15),
         str.Substring(18, 9),
         str.Substring(27, 9),
         str.Substring(32, 5),
         str.Substring(37, 8),
         str.Substring(45, 8)
     };
     return s;
 }