C# 如何使用ChoETL附加到同一csv文件?
目前,我下面的代码调用JsonToCsv()来解析JSON文件并相应地附加到csv,因此结果如下: result.csvC# 如何使用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
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))