从CSV读取浮点/数组错误

时间:2013-02-21 13:04:29

标签: arrays csv processing

我在这里缺少一些基本的东西,但我似乎无法从我的研究中找到什么。

我导入了一个csv文件,将字符串拆分为浮点数,现在希望用一条线将所有点连接到所有其他点。我的代码如下:

String [] data;


void setup () {
size(300, 300);
background(255);

data = loadStrings("points.csv");

for (int i = 0; i < data.length; i++) {

String [] fields = split(data[i], ',');

float t = float(fields[0]);
float n = float(fields[1]);
float x = float(fields[2]);
float y = float(fields[3]);

ellipse(x, y, 10, 10);

line(x, y, x[i], y[i]);
}
}

错误消息是“表达式的类型必须是数组类型,但它已解析为浮动”

我确定这是非常基本的,但我不明白为什么x [i]或y [i]不被视为数组类型。

我真的很感激任何帮助。非常感谢提前。

萨姆

*的 更新 ***

points.csv文件的摘录如下:

219185750   rabih_takkoush  20.88521    19.49821
219185716   MoustaphaAjram  100.870896  59.515259
219185709   jinanejghosh    56.886441   35.489087
219185557   MoustaphaAjram  34.870904   78.515243
219185555   Mohammad8Itani  12.8946         49.48179

我想要完成的是绘制各种地理位置(其中col 3 = x,col 4 = y),然后将所有点与所有其他点连接起来。

以下脚本用于绘制脚本中数组中指定的所有位置:

float[] x = { 50, 100, 150, 200,20,20 };
float[] y = { 10, 30, 20, 250,20,90 };

void setup () {

size(300, 300);
background(255);
}


void draw() {

for (int i = 0; i < x.length; i++) {
ellipse(x[i], y[i], 10, 10);

for (int j = 0; j < x.length; j++) {
line(x[j], y[j], x[i], y[i]);
}
}
}

我想做的是做同样的事情,但是要阅读csv文件的第3列和第4列。

2 个答案:

答案 0 :(得分:0)

您将数据拆分为迭代范围的浮点数,然后尝试访问它们,就好像它们既是浮点数又是line()调用中的数组一样。试试这个:

String[] data;
float[] x, y, t, n;

void setup () {
  size(300, 300);
  data = loadStrings("points.csv");
  int len = data.length;
  x = new float[len];
  x = new float[len];
  t = new float[len];
  n = new float[len];
  for (int i=0; i<len; i++) {
    String line = data[i];
    String[] fields = split(line, ',');
    t[i] = float(fields[0]),
    n[i] = float(fields[1]),
    x[i] = float(fields[2]),
    y[i] = float(fields[3]);
  }
  // don't put draw instructions in setup,
  // put them in draw. if you want to run once,
  // issue a noLoop() so that happens.
  noLoop();
}

void draw() {
  float prevx = x[0], prevy = y[0];
  for (int i=0, last=x.length; i<last; i++) {
    ellipse(x[i], y[i], 10, 10);
    line(prevx,prevy, x[i],y[i]);
    prevx=x[i];
    prevy=y[i];
  }
} 

现在我们将来自CVS的数据存储在我们可以在整个草图中访问的链接数组中,而不是在setup()之后将它们丢弃。

答案 1 :(得分:0)

好吧如果你使用你制作的第一个代码,你只需要改变一些东西,这是你可以做的:

float[] x;
float[] y;
string[] data;

void setup () {
   size(300, 300);
   background(255);

   data = loadStrings("points.csv");
   x = new float[data.length];
   y = new float[data.length];

   for (int i = 0; i < data.length; i++) {
      String [] fields = split(data[i], ',');

      float t = float(fields[0]);
      float n = float(fields[1]);
      float x = float(fields[2]);
      float y = float(fields[3]);
   }
}


void draw() {

   for (int i = 0; i < x.length; i++) {
      ellipse(x[i], y[i], 10, 10);

      for (int j = 0; j < x.length; j++) {
         line(x[j], y[j], x[i], y[i]);
      }
   }
}

正如你所看到的,没有什么新东西,它是你的初始代码和你为csv制作的代码之间的混合。 实际上,您主要需要将xy变量声明为float[],而不仅仅是float。但是在循环中也有一些变化。

在此代码中,首先加载数组中的数据(就像在代码中声明数组的值一样,但这次是从文件中读取这些值),然后像以前一样调用draw方法。

希望它现在有效