即使条件不满足,处理库 CSV 也会继续添加行

Posted

技术标签:

【中文标题】即使条件不满足,处理库 CSV 也会继续添加行【英文标题】:Processing library CSV keeps adding rows even if condition not fulfilled 【发布时间】:2022-01-15 10:11:51 【问题描述】:

与他们一起使用处理库 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"));
  
 

【问题讨论】:

if-statement之前和之中打印i 您在此处显示的内容正常。你能展示更多的代码吗(比如def是在哪里创建的,或者是在哪里被操纵的)? @Cadin 我刚刚编辑并添加了整个代码 【参考方案1】:

当您使用 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...

【讨论】:

以上是关于即使条件不满足,处理库 CSV 也会继续添加行的主要内容,如果未能解决你的问题,请参考以下文章

pandas处理csv文件时,添加索引 2019-02-27

带有 useEffect 的 Next.js useRouter 即使在页面刷新时满足条件也会推送

即使不满足标识符,Segue 也会执行

python读取csv文件并添加索引

如果在 R 中满足某些行和列之间的条件,则确定一个值

添加一个新列,其中包含满足条件的所有行的值列表