即使条件不满足,处理库 CSV 也会继续添加行
Processing library CSV keeps adding rows even if condition not fulfilled
使用它们的处理库 Table
对象
我已经设置了代码,以便它仅在循环内满足条件时在 Table 对象 def
中创建一个新行,但是,它每次都添加一个新行代码遍历循环:
for (int i=0; i!=data.getRowCount(); i++) { //data is my original table object (37 rows)
if (i%3==0) {
def.addRow(); // def is my result object, which should have about 1/3 of the elements
}
}
print(def.getRowCount()); //will output the same as data.getRowCount()
问题似乎不在循环内部,因为如果您要求它 print()
做某事,它会做大约 data.getRowCount()
次的 1/3。但是,仅通过 运行: print(def.getRowCount())
,结果将与 data.getRowCount()
相同,而它应该在 1/3 左右。
完整代码:
Table data, def;
void setup() {
data=loadTable("binance_data.csv", "header");
def=new Table();
def.addColumn("Year", Table.INT);
def.addColumn("Month", Table.INT);
def.addColumn("Day", Table.INT);
def.addColumn("Hour", Table.INT);
def.addColumn("Minute", Table.INT);
def.addColumn("Second", Table.INT);
def.addColumn("Pair", Table.STRING);
def.addColumn("Side", Table.STRING);
def.addColumn("Price", Table.FLOAT);
def.addColumn("Amount", Table.FLOAT);
for (int i=0; i!=data.getRowCount(); i++) {
if (data.getString(i, "Status").equals("FILLED")) { //this is the actual condition.
String[] blocks=data.getString(i, "Date(UTC)").split(" ");
String[] dates=blocks[0].split("-");
String[] times=blocks[1].split(":");
def.addRow();
def.setInt(i, "Year", int(dates[0]));
def.setInt(i, "Month", int(dates[1]));
def.setInt(i, "Day", int(dates[2]));
def.setInt(i, "Hour", int(times[0]));
def.setInt(i, "Minute", int(times[1]));
def.setInt(i, "Second", int(times[2]));
def.setString(i, "Pair", data.getString(i, "Pair"));
def.setString(i, "Side", data.getString(i, "Side"));
def.setFloat(i, "Price", data.getFloat(i, "Average Price"));
def.setFloat(i, "Amount", data.getFloat(i, "Order Amount"));
}
}
}
当您使用 i
变量设置行数据时,您是将数据放入特定编号的行中。
因此,即使您的条件只触发一次,如果当时 i
为 37,那么您会将数据放入第 37 行(之前填充空白行)。请记住,即使不满足条件,i
也会继续递增每个循环。
要解决此问题,您可以获取从 addRow
返回的行并使用该特定引用添加数据,而不是使用 i
插入编号行。
TableRow newRow = def.addRow();
newRow.setInt("Year", int(dates[0]));
newRow.setInt("Month", int(dates[1]));
newRow.setInt("Day", int(dates[2]));
// etc...
使用它们的处理库 Table
对象
我已经设置了代码,以便它仅在循环内满足条件时在 Table 对象 def
中创建一个新行,但是,它每次都添加一个新行代码遍历循环:
for (int i=0; i!=data.getRowCount(); i++) { //data is my original table object (37 rows)
if (i%3==0) {
def.addRow(); // def is my result object, which should have about 1/3 of the elements
}
}
print(def.getRowCount()); //will output the same as data.getRowCount()
问题似乎不在循环内部,因为如果您要求它 print()
做某事,它会做大约 data.getRowCount()
次的 1/3。但是,仅通过 运行: print(def.getRowCount())
,结果将与 data.getRowCount()
相同,而它应该在 1/3 左右。
完整代码:
Table data, def;
void setup() {
data=loadTable("binance_data.csv", "header");
def=new Table();
def.addColumn("Year", Table.INT);
def.addColumn("Month", Table.INT);
def.addColumn("Day", Table.INT);
def.addColumn("Hour", Table.INT);
def.addColumn("Minute", Table.INT);
def.addColumn("Second", Table.INT);
def.addColumn("Pair", Table.STRING);
def.addColumn("Side", Table.STRING);
def.addColumn("Price", Table.FLOAT);
def.addColumn("Amount", Table.FLOAT);
for (int i=0; i!=data.getRowCount(); i++) {
if (data.getString(i, "Status").equals("FILLED")) { //this is the actual condition.
String[] blocks=data.getString(i, "Date(UTC)").split(" ");
String[] dates=blocks[0].split("-");
String[] times=blocks[1].split(":");
def.addRow();
def.setInt(i, "Year", int(dates[0]));
def.setInt(i, "Month", int(dates[1]));
def.setInt(i, "Day", int(dates[2]));
def.setInt(i, "Hour", int(times[0]));
def.setInt(i, "Minute", int(times[1]));
def.setInt(i, "Second", int(times[2]));
def.setString(i, "Pair", data.getString(i, "Pair"));
def.setString(i, "Side", data.getString(i, "Side"));
def.setFloat(i, "Price", data.getFloat(i, "Average Price"));
def.setFloat(i, "Amount", data.getFloat(i, "Order Amount"));
}
}
}
当您使用 i
变量设置行数据时,您是将数据放入特定编号的行中。
因此,即使您的条件只触发一次,如果当时 i
为 37,那么您会将数据放入第 37 行(之前填充空白行)。请记住,即使不满足条件,i
也会继续递增每个循环。
要解决此问题,您可以获取从 addRow
返回的行并使用该特定引用添加数据,而不是使用 i
插入编号行。
TableRow newRow = def.addRow();
newRow.setInt("Year", int(dates[0]));
newRow.setInt("Month", int(dates[1]));
newRow.setInt("Day", int(dates[2]));
// etc...