2

.csv ファイルがあり、データを文字列ではなくその形式で読み取りたい。これは、OK の場合にファイルを readbuffer に保存する関数です。

fileGetString(readbuffer,elcount(readbuffer),readHandle)!=0)

そして、データは次の形式になっています。

Temperature;12.25;15.65;-25.12;80;
Time;1;2;4;7;

温度をバッファ " Temperature[i]" に保存し、時間 " Time[i]" で同じことを行いたいのですが、CAPL でこれを行うにはどうすればよいですか?

String のような各データを読み取り、integer または float にキャストしていくつかの操作を実行できることはわかっていますが、コードを最適化し、各データをその形式で読み取りたいと考えています。

4

1 に答える 1

1

を使用して、文字列を浮動小数点数に変換できますstrtod()。楽しみのために、完全な例を次に示します。

on start
{
  dword fh;
  char text[255];  
  double Temperature[4], Time[4];
  int i;

  /* open file */
  fh = openFileRead("a.csv",0);
  if (!fh) {
    write ("ERROR: Open file failed!");
    return;
  }

  /* read the 'Temperature' line */
  if (!fileGetString(text, elcount(text), fh) ||
      strstr(text, "Temperature;") != 0) {
    write("ERROR: Wrong file format, 'Temperature' not found!");
    return;
  }

  /* get the 'Temperature' values */
  getValuesFromCsvString(text, Temperature);

  /* read the 'Time' line */
  if (!fileGetString(text, elcount(text), fh) ||
      strstr(text, "Time;") != 0) {
    write("ERROR: Wrong file format, 'Time' not found!");
    return;
  }

  /* get the 'Time' values */
  getValuesFromCsvString(text, Time);

  /* output values */
  for (i = 0; i < elcount(Temperature); i++)
    write("Temperature[%i] = %6.2f", i, Temperature[i]);  
  for (i = 0; i < elcount(Time); i++)
    write("Time[%i] = %2.0f", i, Time[i]);    
}

int getValuesFromCsvString(char text[], double vals[])
{
  long i, pos;
  double res;

  pos = strstr(text, ";");
  str_replace(text, ";", " ");

  for (i = 0; i < elcount(vals) ; i++) {
    pos = strtod(text, pos, res);
    if (pos >= 0)
      vals[i] = res;
    else
      break;
  }

  return 0;
}

出力:

Temperature[0] =  12.25
Temperature[1] =  15.65
Temperature[2] = -25.12
Temperature[3] =  80.00
Time[0] =  1
Time[1] =  2
Time[2] =  4
Time[3] =  7
于 2015-09-09T17:28:41.073 に答える