当前位置:  开发笔记 > 编程语言 > 正文

在C#中创建固定宽度的文件

如何解决《在C#中创建固定宽度的文件》经验,为你挑选了5个好方法。

在C#中创建固定宽度文件的最佳方法是什么.我有一堆字段有很长的要写出来.说20,80.10,2等所有左对齐.是否有捷径可寻?



1> Wheelie..:

您可以使用string.Format轻松填充带空格的值,例如

string a = String.Format("|{0,5}|{1,5}|{2,5}", 1, 20, 300);
string b = String.Format("|{0,-5}|{1,-5}|{2,-5}", 1, 20, 300);

// 'a' will be equal to "|    1|   20|  300|"
// 'b' will be equal to "|1    |20   |300  |"


但有一点需要注意:如果数据长于指定的宽度,则不会被截断.因此,您必须在可能长于宽度的任何字段上使用data.Substring(0,width),这会快速获得详细(和重复/非干).

2> Chris Wenham..:

这是我为可配置的固定宽度文件写入模块制作的系统.它配置了一个XML文件,相关部分如下所示:


  
  
  
  
  
  
  

StartAt告诉程序您的位置是基于0还是基于1.我做了那个可配置的,因为我会从规范中复制掉偏移量,并希望配置尽可能地类似于规范,无论作者选择什么起始索引.

Position标记上的Name属性引用DataTable中列的名称.

下面的代码为.NET 3.5编写,使用LINQ到XML,因此该方法以为它会传递一个的XElement上述配置,使用后你可以得到XDocument.Load(filename)加载XML文件,然后调用.Descendants("WriteFixedWidth")XDocument获取配置元素的对象.

    public void WriteFixedWidth(System.Xml.Linq.XElement CommandNode, DataTable Table, Stream outputStream)
    {
        StreamWriter Output = new StreamWriter(outputStream);
        int StartAt = CommandNode.Attribute("StartAt") != null ? int.Parse(CommandNode.Attribute("StartAt").Value) : 0;

        var positions = from c in CommandNode.Descendants(Namespaces.Integration + "Position")
                        orderby int.Parse(c.Attribute("Start").Value) ascending
                        select new
                        {
                            Name = c.Attribute("Name").Value,
                            Start = int.Parse(c.Attribute("Start").Value) - StartAt,
                            Length = int.Parse(c.Attribute("Length").Value),
                            Justification = c.Attribute("Justification") != null ? c.Attribute("Justification").Value.ToLower() : "left"
                        };

        int lineLength = positions.Last().Start + positions.Last().Length;
        foreach (DataRow row in Table.Rows)
        {
            StringBuilder line = new StringBuilder(lineLength);
            foreach (var p in positions)
                line.Insert(p.Start, 
                    p.Justification == "left" ? (row.Field(p.Name) ?? "").PadRight(p.Length,' ')
                                              : (row.Field(p.Name) ?? "").PadLeft(p.Length,' ') 
                    );
            Output.WriteLine(line.ToString());
        }
        Output.Flush();
    }

引擎是StringBuilder,它比将不可变字符串连接在一起更快,特别是如果你正在处理多兆字节的文件.


我只想说这是一个绝妙的主意,喜欢它!+1

3> 小智..:

试试FileHelpers:www.filehelpers.com

这是一个例子:http: //www.filehelpers.com/quick_start_fixed.html



4> Andrew Burge..:

使用String类的.PadRight函数(用于左对齐数据).所以:

handle.WriteLine(s20.PadRight(20));
handle.WriteLine(s80.PadRight(80));
handle.WriteLine(s10.PadRight(10));
handle.WriteLine(s2.PadRight(2));



5> Yitzchok..:

你可以使用http://www.filehelpers.com/

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有