C# 在C中创建固定宽度的文件#
在C#中创建固定宽度文件的最佳方法是什么。我有一大堆字段要写出长度。说20,80.10,2等,全部左对齐。有没有一个简单的方法可以做到这一点 您不能使用标准文本文件吗?您可以逐行读取数据。使用String.Format()C# 在C中创建固定宽度的文件#,c#,C#,在C#中创建固定宽度文件的最佳方法是什么。我有一大堆字段要写出长度。说20,80.10,2等,全部左对齐。有没有一个简单的方法可以做到这一点 您不能使用标准文本文件吗?您可以逐行读取数据。使用String.Format() 尝试使用myString.PadRight(totalLengthForField“”)您可以使用StreamWriter,并在Write(string)调用中使用string.Format()创建给定字段的正确宽度的字符串。使用string类的.PadRight函数(用于左
尝试使用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));
你是说你想用空格填充右边的所有数字
如果是这样,或者应该让您走上正轨。您可以使用ascienceoding.UTF8.GetBytes(text)将其转换为字节数组。然后将字节数组作为固定大小的记录写入文件
UTF8在表示某些字符所需的字节数上有所不同,UTF16更容易预测,每个字符2个字节。您可以使用string.Format轻松地用空格填充值 e、 g
试试FileHelpers:www.FileHelpers.com 下面是一个例子:
之前的各种填充/格式化文章已经足够了,但是您可能对实现ISerializable感兴趣
这是一篇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>
该引擎是StringBuilder,它比将不可变字符串连接在一起要快,尤其是在处理多兆字节文件时。我正在对字符串使用扩展方法,是的,XML注释对此可能很有用,但如果您希望其他开发人员重复使用
public static class StringExtensions
{
/// <summary>
/// FixedWidth string extension method. Trims spaces, then pads right.
/// </summary>
/// <param name="self">extension method target</param>
/// <param name="totalLength">The length of the string to return (including 'spaceOnRight')</param>
/// <param name="spaceOnRight">The number of spaces required to the right of the content.</param>
/// <returns>a new string</returns>
/// <example>
/// This example calls the extension method 3 times to construct a string with 3 fixed width fields of 20 characters,
/// 2 of which are reserved for empty spacing on the right side.
/// <code>
///const int colWidth = 20;
///const int spaceRight = 2;
///string headerLine = string.Format(
/// "{0}{1}{2}",
/// "Title".FixedWidth(colWidth, spaceRight),
/// "Quantity".FixedWidth(colWidth, spaceRight),
/// "Total".FixedWidth(colWidth, spaceRight));
/// </code>
/// </example>
public static string FixedWidth(this string self, int totalLength, int spaceOnRight)
{
if (totalLength < spaceOnRight) spaceOnRight = 1; // handle silly use.
string s = self.Trim();
if (s.Length > (totalLength - spaceOnRight))
{
s = s.Substring(0, totalLength - spaceOnRight);
}
return s.PadRight(totalLength);
}
}
Darren对这个问题的回答启发了我使用扩展方法,但我没有扩展
String
,而是扩展了StringBuilder
。我写了两种方法:
public static StringBuilder AppendFixed(this StringBuilder sb, int length, string value)
{
if (String.IsNullOrWhiteSpace(value))
return sb.Append(String.Empty.PadLeft(length));
if (value.Length <= length)
return sb.Append(value.PadLeft(length));
else
return sb.Append(value.Substring(0, length));
}
public static StringBuilder AppendFixed(this StringBuilder sb, int length, string value, out string rest)
{
rest = String.Empty;
if (String.IsNullOrWhiteSpace(value))
return sb.AppendFixed(length, value);
if (value.Length > length)
rest = value.Substring(length);
return sb.AppendFixed(length, value);
}
不一定,文本文件可能不会被另一个C#应用程序读取,而是需要特定格式文本文件的主框架。不过有一个警告:如果数据长度超过指定的宽度,则不会被截断。因此,您必须使用数据。任何字段上的子字符串(0,宽度)都可能比宽度长,这会很快变得冗长(并且重复/不干燥)。只是因为我错过了它,所以我的速度很慢,但是如果显示结果,那么字体使用的宽度也需要固定。我不得不说这是一个非常好的主意,喜欢它+1我无法引用
名称空间。集成
,能否请您提供有关此的更多详细信息。Vikas,您可以在此处找到更多信息。如果您的XML文档使用名称空间,则使用名称空间.Integration…当然,您可以使用标准的.NET FileStream编写文件。可以使用以下库:
public static class StringExtensions
{
/// <summary>
/// FixedWidth string extension method. Trims spaces, then pads right.
/// </summary>
/// <param name="self">extension method target</param>
/// <param name="totalLength">The length of the string to return (including 'spaceOnRight')</param>
/// <param name="spaceOnRight">The number of spaces required to the right of the content.</param>
/// <returns>a new string</returns>
/// <example>
/// This example calls the extension method 3 times to construct a string with 3 fixed width fields of 20 characters,
/// 2 of which are reserved for empty spacing on the right side.
/// <code>
///const int colWidth = 20;
///const int spaceRight = 2;
///string headerLine = string.Format(
/// "{0}{1}{2}",
/// "Title".FixedWidth(colWidth, spaceRight),
/// "Quantity".FixedWidth(colWidth, spaceRight),
/// "Total".FixedWidth(colWidth, spaceRight));
/// </code>
/// </example>
public static string FixedWidth(this string self, int totalLength, int spaceOnRight)
{
if (totalLength < spaceOnRight) spaceOnRight = 1; // handle silly use.
string s = self.Trim();
if (s.Length > (totalLength - spaceOnRight))
{
s = s.Substring(0, totalLength - spaceOnRight);
}
return s.PadRight(totalLength);
}
}
public static StringBuilder AppendFixed(this StringBuilder sb, int length, string value)
{
if (String.IsNullOrWhiteSpace(value))
return sb.Append(String.Empty.PadLeft(length));
if (value.Length <= length)
return sb.Append(value.PadLeft(length));
else
return sb.Append(value.Substring(0, length));
}
public static StringBuilder AppendFixed(this StringBuilder sb, int length, string value, out string rest)
{
rest = String.Empty;
if (String.IsNullOrWhiteSpace(value))
return sb.AppendFixed(length, value);
if (value.Length > length)
rest = value.Substring(length);
return sb.AppendFixed(length, value);
}
string rest;
StringBuilder clientRecord = new StringBuilder();
clientRecord.AppendFixed(40, doc.ClientName, out rest);
clientRecord.AppendFixed(40, rest);
clientRecord.AppendFixed(40, doc.ClientAddress, out rest);
clientRecord.AppendFixed(40, rest);