在C#中创建固定宽度文件的最佳方法是什么.我有一堆字段有很长的要写出来.说20,80.10,2等所有左对齐.是否有捷径可寻?
您可以使用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 |"
这是我为可配置的固定宽度文件写入模块制作的系统.它配置了一个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,它比将不可变字符串连接在一起更快,特别是如果你正在处理多兆字节的文件.
试试FileHelpers:www.filehelpers.com
这是一个例子:http: //www.filehelpers.com/quick_start_fixed.html
使用String类的.PadRight函数(用于左对齐数据).所以:
handle.WriteLine(s20.PadRight(20)); handle.WriteLine(s80.PadRight(80)); handle.WriteLine(s10.PadRight(10)); handle.WriteLine(s2.PadRight(2));
你可以使用http://www.filehelpers.com/