Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用ChoETL附加到同一csv文件?_C#_Choetl - Fatal编程技术网

C# 如何使用ChoETL附加到同一csv文件?

C# 如何使用ChoETL附加到同一csv文件?,c#,choetl,C#,Choetl,目前,我下面的代码调用JsonToCsv()来解析JSON文件并相应地附加到csv,因此结果如下: result.csv File Name Page Practice Name file1.json 1 Associates & Co 但是,正如您所看到的,我使用for循环来迭代一组JSON文件,我的目的是解析它们并将它们附加到csv。因此,如果我有3个json文件,预期的csv文件应该是这样的: File Name Page Practice Name

目前,我下面的代码调用JsonToCsv()来解析JSON文件并相应地附加到csv,因此结果如下:

result.csv

File Name    Page  Practice Name
file1.json   1     Associates & Co 
但是,正如您所看到的,我使用for循环来迭代一组JSON文件,我的目的是解析它们并将它们附加到csv。因此,如果我有3个json文件,预期的csv文件应该是这样的:

File Name    Page  Practice Name
fileXYZ.json 1     XYZ & Co
fileAB2.json 1     ABC & Co
file1.json   1     Associates & Co
然而,发生的是csv文件被覆盖,我只看到csv文件中最后一个文件的结果。如何将其附加到同一个文件

static void Main(string[] args)
{
    //Output to CSV
    foreach (var jsonFile in Directory.GetFiles(jsonFilesPath))
    {
        JsonToCsv(jsonFile, csvFilePath);
    }
}

public static void JsonToCsv(string jsonInputFile, string csvFile)
{
    using (var p = new ChoJSONReader(jsonInputFile).WithJSONPath("$..readResults"))
    {
        using (var w = new ChoCSVWriter(csvFile)//.WithFirstLineHeader())
            .WithField("FileName", fieldName: "File Name")
            .WithField("Page")
            .WithField("PracticeName", fieldName: "Practice Name")
            .WithFirstLineHeader()
            )
        {
            // Limit the result to page 1 since the fields below only exist on the 1st page
            w.Write(p
                .Where(r1 => r1.page == 1)
                .Select(r1 =>
                {
                    var lines = (dynamic[])r1.lines;
                    return new
                    {
                        FileName = inputFile,
                        Page = r1.page,
                        PracticeName = lines[6].text,
                    };
                }
        ));
        }
    }
}

第一种选择。我建议您更改方法签名以接受多个文件

public static void JsonToCsv(IEnumerable<string> jsonInputFiles, string csvFile)
{
    using (var w = new ChoCSVWriter(csvFile)
        .WithField("FileName", fieldName: "File Name")
        .WithField("Page")
        .WithField("PracticeName", fieldName: "Practice Name")
        .WithFirstLineHeader()
        )
    {
        foreach (var jsonInputFile in jsonInputFiles)
        {
            using (var p = new ChoJSONReader(jsonInputFile).WithJSONPath("$..readResults"))
            {
                w.Write(p
                    .Where(r1 => r1.page == 1)
                    .Select(r1 =>
                    {
                        var lines = (dynamic[])r1.lines;
                        return new
                        {
                            FileName = inputFile,
                            Page = r1.page,
                            PracticeName = lines[6].text,
                        };
                    }
                ));
            }
        }
    }
}
第三个选项-来自评论(基于第二个)。在创建和附加选项之间切换

bool someCondition = true;
FileMode fileMode = someCondition ? FileMode.Append : FileMode.Create;
using (var fs = new FileStream(@"D:\file.csv", fileMode, FileAccess.Write))

这回答了你的问题吗@DCCoder不,那不一样。他的场景更复杂,用例也不同。他也没有在循环中使用函数。最后,我考虑了附件。然而,这也适用于IO流,但我使用的是choetl idk,如果这是解决方案的话,那么AppendAllText和使用FileStream append就不能满足您的需要了?(这两个问题的答案都包括在内)。你能解释一下为什么你不能使用这两种方法吗?@dcoder哦,我现在明白了,用耶戈尔的答案可以做到这一点<代码>文件模式。追加。有趣!所以我意识到的一件事是,如果csv文件不存在,chocsvwriter会很好地自动创建csv文件。但是,如果我想附加,就像您的选项允许的那样,但每当启动新会话时,它就会创建(覆盖)现有文件(如果有的话),该怎么办?这将是一个不错的第三个选项只需传递一个布尔标志,它将翻转FileMode.Append to FileMode.CreateI编辑我的答案,请检查
someCondition
可以通过参数传递。我刚刚尝试了第二个选项,效果非常好!然而,我不得不从
writer?.Dispose()中删除
在finally块中,否则它会非常奇怪地追加。令人困惑的是,
只是一个空检查。我认为这不会影响csv的写作
bool someCondition = true;
FileMode fileMode = someCondition ? FileMode.Append : FileMode.Create;
using (var fs = new FileStream(@"D:\file.csv", fileMode, FileAccess.Write))