在C#中创建固定宽度的文件
在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,它比将不可变的字符串连接在一起要快,尤其是在处理数兆字节的文件时。