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

时间:2020-03-05 18:59:41  来源:igfitidea点击:

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

解决方案

回答

我们不能使用标准文本文件吗?我们可以逐行读回数据。

回答

使用String.Format()

http://msdn.microsoft.com/en-us/library/aa331875.aspx

回答

尝试使用myString.PadRight(totalLengthForField,'')

回答

我们可以使用StreamWriter,并在Write(string)调用中使用String.Format()创建一个字符串,该字符串是给定字段的正确宽度。

回答

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

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

回答

我们是说要在右边用空格填充所有数字?

如果是这样,String.PadRight或者String.Format应该会让我们步入正轨。

回答

我们可以使用ASCIIEncoding.UTF8.GetBytes(text)将其转换为字节数组。然后将字节数组作为固定大小的记录写到文件中。

UTF8在表示某些字符所需的字节数方面有所不同,UTF16更可预测,每个字符2个字节。

回答

我们可以使用http://www.filehelpers.com/

回答

我们可以使用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  |"

回答

尝试FileHelpers:www.filehelpers.com

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

回答

之前的各种填充/格式化帖子将足够工作,但是我们可能对实现ISerializable感兴趣。

这是有关.NET中对象序列化的msdn文章

回答

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

<WriteFixedWidth Table="orders" StartAt="1" Output="Return">
  <Position Start="1" Length="17" Name="Unique Identifier"/>
  <Position Start="18" Length="3" Name="Error Flag"/>
  <Position Start="21" Length="16" Name="Account Number" Justification="right"/>
  <Position Start="37" Length="8" Name="Member Number"/>
  <Position Start="45" Length="4" Name="Product"/>
  <Position Start="49" Length="3" Name="Paytype"/>
  <Position Start="52" Length="9" Name="Transit Routing Number"/>
</WriteFixedWidth>

StartAt告诉程序头寸是从0开始还是从1开始。我将其设置为可配置,因为我将复制规范的偏移量,并希望使该配置尽可能类似于该规范,无论作者选择哪种起始索引。

Position标签上的Name属性是指数据表中列的名称。

以下代码是使用LINQ-to-XML为.Net 3.5编写的,因此该方法假定将使用上述配置将其传递给XElement,使用XDocument.Load(filename)加载后即可获取XML文件,然后在XDocument对象上调用.Descendants(" WriteFixedWidth")以获取配置元素。

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<string>(p.Name) ?? "").PadRight(p.Length,' ')
                                              : (row.Field<string>(p.Name) ?? "").PadLeft(p.Length,' ') 
                    );
            Output.WriteLine(line.ToString());
        }
        Output.Flush();
    }

引擎是StringBuilder,它比将不可变的字符串连接在一起要快,尤其是在处理数兆字节的文件时。