用 csvhelper 写一个 space 分隔文件
write a space delimited file with csvhelper
我在 CsvHelper 中没有看到这个选项,但是这个库是否支持 space 分隔符,以便每个字段都有预定数量的字符,例如 space 或句点?
示例:名字 -len:10 姓氏 - len:15 将翻译成带句点的
john......doe............
sam.......simpson........
CsvHelper 目前不支持固定宽度的文件。有一个开放的功能请求来添加固定宽度支持,但我认为短期内不会有任何实施它的计划。 https://github.com/CsvHelperContrib/CsvHelperContrib/issues/2
如果您正在编写固定宽度的文件,这应该可行。我没有办法读取固定宽度的文件。
public class Program
{
public static void Main(string[] args)
{
var records = new List<Foo>
{
new Foo { FirstName = "john", LastName = "doe" },
new Foo { FirstName = "sam", LastName = "simpson"}
};
using (CsvWriter csv = new CsvWriter(Console.Out))
{
csv.Configuration.RegisterClassMap<FooMap>();
csv.Configuration.HasHeaderRecord = false;
csv.Configuration.Delimiter = "";
csv.Configuration.ShouldQuote = (field, context) => false;
csv.WriteRecords(records);
}
Console.ReadLine();
}
}
public class Foo
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public sealed class FooMap : ClassMap<Foo>
{
public FooMap()
{
Map(m => m.FirstName).TypeConverter(new FixedWidthOutput(10, '.'));
Map(m => m.LastName).TypeConverter(new FixedWidthOutput(15, '.'));
}
}
public class FixedWidthOutput : DefaultTypeConverter
{
private readonly int _fieldLength;
private readonly char _paddingCharacter;
public FixedWidthOutput(int fieldLength, char paddingCharacter = ' ')
{
_fieldLength = fieldLength;
_paddingCharacter = paddingCharacter;
}
public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
{
return value.ToString().PadRight(_fieldLength, _paddingCharacter);
}
}
我知道它已经得到解答,但我发布我的方法只是为了将其记录在案和另一种可能的替代方法。
我使用了getter方法。
所以我的 class 看起来像。
public class MyTrailer
{
private string trailerText;
public string TrailerText
{
get
{
var retValue = "TotalRecords=";
retValue = retValue + trailerText.PadLeft(14, '0');
return retValue;
}
set { trailerText = value; }
}
}
在 CSV 写入器上,
csv.WriteRecordsAsync
(new List<MyTrailer> { new MyTrailer { TrailerText = recordCount } });
我在 CsvHelper 中没有看到这个选项,但是这个库是否支持 space 分隔符,以便每个字段都有预定数量的字符,例如 space 或句点?
示例:名字 -len:10 姓氏 - len:15 将翻译成带句点的
john......doe............
sam.......simpson........
CsvHelper 目前不支持固定宽度的文件。有一个开放的功能请求来添加固定宽度支持,但我认为短期内不会有任何实施它的计划。 https://github.com/CsvHelperContrib/CsvHelperContrib/issues/2
如果您正在编写固定宽度的文件,这应该可行。我没有办法读取固定宽度的文件。
public class Program
{
public static void Main(string[] args)
{
var records = new List<Foo>
{
new Foo { FirstName = "john", LastName = "doe" },
new Foo { FirstName = "sam", LastName = "simpson"}
};
using (CsvWriter csv = new CsvWriter(Console.Out))
{
csv.Configuration.RegisterClassMap<FooMap>();
csv.Configuration.HasHeaderRecord = false;
csv.Configuration.Delimiter = "";
csv.Configuration.ShouldQuote = (field, context) => false;
csv.WriteRecords(records);
}
Console.ReadLine();
}
}
public class Foo
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public sealed class FooMap : ClassMap<Foo>
{
public FooMap()
{
Map(m => m.FirstName).TypeConverter(new FixedWidthOutput(10, '.'));
Map(m => m.LastName).TypeConverter(new FixedWidthOutput(15, '.'));
}
}
public class FixedWidthOutput : DefaultTypeConverter
{
private readonly int _fieldLength;
private readonly char _paddingCharacter;
public FixedWidthOutput(int fieldLength, char paddingCharacter = ' ')
{
_fieldLength = fieldLength;
_paddingCharacter = paddingCharacter;
}
public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
{
return value.ToString().PadRight(_fieldLength, _paddingCharacter);
}
}
我知道它已经得到解答,但我发布我的方法只是为了将其记录在案和另一种可能的替代方法。
我使用了getter方法。 所以我的 class 看起来像。
public class MyTrailer
{
private string trailerText;
public string TrailerText
{
get
{
var retValue = "TotalRecords=";
retValue = retValue + trailerText.PadLeft(14, '0');
return retValue;
}
set { trailerText = value; }
}
}
在 CSV 写入器上,
csv.WriteRecordsAsync
(new List<MyTrailer> { new MyTrailer { TrailerText = recordCount } });