我需要读取固定宽度的文件,将记录映射到另一种类型,然后将该数据写入 csv 流。我正在尝试使用 FileHelpers 来执行此操作,但
WriteStream
似乎没有将任何数据写入流。
FixedWidthType.cs(要读取的类型)
[FixedLengthRecord, IgnoreFirst(2), IgnoreLast(1)]
public class FixedWidthType
{
[FieldFixedLength(6), FieldTrim(TrimMode.Right)]
public string BranchCode { get; set; }
// ...
}
CsvType.cs(要写入的类型)
[DelimitedRecord("|")]
public class CsvType
{
public string BranchCode { get; set; }
// ...
}
程序.cs
var readerEngine = new FileHelperEngine<FixedWidthType>();
var writerEngine = new FileHelperEngine<CsvType>();
var file = File.ReadAllBytes("fixedWidthFile.txt");
using (var sr = new MemoryStream(file))
using (var reader = new StreamReader(sr))
using (var sw = new MemoryStream())
using (var writer = new StreamWriter(sw))
{
// read fixedwidth data
var fixedWidthRecords = readerEngine.ReadStream(reader);
var csvRecords = fixedWidthRecords.Select(r => new CsvType
{
BranchCode = r.BranchCode,
// ...
}).ToList();
Console.WriteLine(csvRecords.Count()); // output: 2
// write csv data
writerEngine.WriteStream(writer, csvRecords);
Console.WriteLine(sw.ToArray().Count()); // output: 0
File.WriteAllBytes("newfile.csv", sw.ToArray());
}
上面的代码写入了一个空白文件。 ps:我知道我可以使用
writerEngine.WriteFile
来完成上述操作(顺便说一句,它确实有效),但在我的情况下,我特别需要一个流。编写上面文件的目的只是为了查看输出。
关闭
TextWriter
和/或其底层Stream
(通过显式.Close()
或.Dispose()
调用 - 或通过using(){}
块或
using;
语句隐式)也会刷新它,如果您打算在写入后从
Stream
读回而不关闭它,那么您需要刷新 TextWriter
,因为它有自己的缓冲区,并且您可能还需要rewind 流也通过设置
.Position
。
但是如果你查看程序的应用程序逻辑,你实际上不需要Flush
任何东西,只需将代码更改为:
var readerEngine = new FileHelperEngine<FixedWidthType>();
var writerEngine = new FileHelperEngine<CsvType>();
using (FileStream fixedWidthFS = new FileStream( "fixedWidthFile.txt", FileAccess.Read, FileShare.None, FileMode.Open ))
using (StreamReader fixedWidthReader = new StreamReader(fixedWidthFS))
using (FileStream outputFS = new FileStream( "output.dat", FileAccess.Write, FileShare.None, FileMode.CreateNew ))
using (StreamWriter outputWriter = new StreamWriter(outputFS)) // <-- Watch out for the default encoding possibly being UTF8 with BOM, see https://stackoverflow.com/questions/5266069/streamwriter-and-utf-8-byte-order-marks
{
var csvRecords = readerEngine.ReadStream( fixedWidthReader )
.Select(r => new CsvType
{
BranchCode = r.BranchCode,
// ...
});
writerEngine.WriteStream( outputWriter, csvRecords );
}