CSV 编写器无法写入对象列表
CSV writer cannot write List of objects
我使用 CSV 编写器,它在大多数情况下工作得很好。当我尝试写入具有列表的对象时,它会忽略仅写入列表。
对于 eg.below,它写入 Trade 对象的所有属性,但 Wave 除外,Wave 是 Wave 对象的列表
我的 class 交易有以下内容,包括波浪列表。
class Trade
{
public string symbol { get; set; }
public bool isOpen { get; set; }
public DateTime OpenTime { get; set; }
public DateTime CloseTime { get; set; }
public double mfe { get; set; }
public double mae { get; set; }
public double entryPrice { get; set; }
public double exitprice { get; set; }
public TradeP TradeSignal { get; set; }
public string comments { get; set; }
public int Days2Stop { get; set; }
public double TimeBreakout { get; set; }
public double r { get; set; }
public int daysreach1r { get; set; }
public int daysreach9x50 { get; set; }
public double maetill1r { get; set; }
public bool Day1ClosedDown { get; set; }
public List<Wave> Waves { get; set; }
}
// write all the trade objects
using (System.IO.StreamWriter file =
new System.IO.StreamWriter(@"C:\temp\" + DateTime.Now.ToString("yyyyMMdd") + "traderesults.txt", true))
{
var csv = new CsvWriter(file);
csv.WriteRecords(Trades);
}
在上面的屏幕截图中,您可以看到 csv 写入器打印了所有对象属性。它很长,但最后它没有打印 Wave 对象的属性
CSV 文件是平面文件。如果您必须手动创建文件,您将如何表示此类记录。你将不得不重复记录。这没有意义,所以图书馆通过忽略 Waves
.
来做正确的事
解决方法是在您的 class 中添加另一个 属性,return 是 Wave
对象中 属性 的逗号分隔值,说 Prop1
(string
).
class Trade {
//..
public string WaveCSV {
get {
return string.Join(",", Waves.Select(w => w.Prop1).ToArray());
}
}
}
您需要用 "
限定 WaveCSV
以便值中的逗号不会造成伤害,或者完全使用不同的分隔符。
编辑:
如果你需要多个属性,那么你可以覆盖Wave
中的ToString()
class,return任何你想要的,然后使用w.ToString()
代替。
我使用 CSV 编写器,它在大多数情况下工作得很好。当我尝试写入具有列表的对象时,它会忽略仅写入列表。 对于 eg.below,它写入 Trade 对象的所有属性,但 Wave 除外,Wave 是 Wave 对象的列表
我的 class 交易有以下内容,包括波浪列表。
class Trade
{
public string symbol { get; set; }
public bool isOpen { get; set; }
public DateTime OpenTime { get; set; }
public DateTime CloseTime { get; set; }
public double mfe { get; set; }
public double mae { get; set; }
public double entryPrice { get; set; }
public double exitprice { get; set; }
public TradeP TradeSignal { get; set; }
public string comments { get; set; }
public int Days2Stop { get; set; }
public double TimeBreakout { get; set; }
public double r { get; set; }
public int daysreach1r { get; set; }
public int daysreach9x50 { get; set; }
public double maetill1r { get; set; }
public bool Day1ClosedDown { get; set; }
public List<Wave> Waves { get; set; }
}
// write all the trade objects
using (System.IO.StreamWriter file =
new System.IO.StreamWriter(@"C:\temp\" + DateTime.Now.ToString("yyyyMMdd") + "traderesults.txt", true))
{
var csv = new CsvWriter(file);
csv.WriteRecords(Trades);
}
在上面的屏幕截图中,您可以看到 csv 写入器打印了所有对象属性。它很长,但最后它没有打印 Wave 对象的属性
CSV 文件是平面文件。如果您必须手动创建文件,您将如何表示此类记录。你将不得不重复记录。这没有意义,所以图书馆通过忽略 Waves
.
解决方法是在您的 class 中添加另一个 属性,return 是 Wave
对象中 属性 的逗号分隔值,说 Prop1
(string
).
class Trade {
//..
public string WaveCSV {
get {
return string.Join(",", Waves.Select(w => w.Prop1).ToArray());
}
}
}
您需要用 "
限定 WaveCSV
以便值中的逗号不会造成伤害,或者完全使用不同的分隔符。
编辑:
如果你需要多个属性,那么你可以覆盖Wave
中的ToString()
class,return任何你想要的,然后使用w.ToString()
代替。