Whe*_*lie 52
您可以使用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 |"
Run Code Online (Sandbox Code Playgroud)
Chr*_*ham 27
这是我为可配置的固定宽度文件写入模块制作的系统.它配置了一个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>
Run Code Online (Sandbox Code Playgroud)
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<string>(p.Name) ?? "").PadRight(p.Length,' ')
: (row.Field<string>(p.Name) ?? "").PadLeft(p.Length,' ')
);
Output.WriteLine(line.ToString());
}
Output.Flush();
}
Run Code Online (Sandbox Code Playgroud)
引擎是StringBuilder,它比将不可变字符串连接在一起更快,特别是如果你正在处理多兆字节的文件.
使用String类的.PadRight函数(用于左对齐数据).所以:
handle.WriteLine(s20.PadRight(20));
handle.WriteLine(s80.PadRight(80));
handle.WriteLine(s10.PadRight(10));
handle.WriteLine(s2.PadRight(2));
Run Code Online (Sandbox Code Playgroud)