FileHelpers WriteStream 不写入数据

问题描述 投票:0回答:1

我需要读取固定宽度的文件,将记录映射到另一种类型,然后将该数据写入 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
来完成上述操作(顺便说一句,它确实有效),但在我的情况下,我特别需要一个流。编写上面文件的目的只是为了查看输出。

c# .net csv fixed-width filehelpers
1个回答
0
投票

关闭

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 ); }
    
© www.soinside.com 2019 - 2024. All rights reserved.