我需要读取一个固定宽度的文件,将记录Map到另一种类型,然后将该数据写入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; }
// ...
}
型
Program.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
来完成上面的工作(顺便说一句,这确实有效),但我特别需要一个流在我的情况下。写上面的文件的目的只是为了查看输出。
1条答案
按热度按时间mqxuamgl1#
在关闭
TextWriter
和/或其底层Stream
(通过显式.Close()
或.Dispose()
调用-或implicitly via ausing(){}
block orusing;
statement也将刷新它)时,如果您打算在写入Stream
后从Stream
回读 * 而不关闭它,那么您需要刷新TextWriter
,因为它有自己的缓冲区,您可能还需要通过设置.Position
来 * 倒带 * 流-并利用leaveOpen: true
。字符串
Flush
任何东西,只要把你的代码改为:型
Stream
或TextWriter
/TextReader
仅用于输入和/或输出时,您应该在它们的名称中添加“输入”或“输出”(或“输入”/“输出”),以使其更容易理解。