如何在c++中导入.csv文件数据到gsl_vectors ?



我有一个。csv文件,看起来像:

X,Y,Z
0,0,0
0,0,0
-0.00624347,-0.0182673,1.00063
-0.00845628,-0.0374925,1.00058
-0.00494793,-0.0295639,0.927447
-0.00285682,-0.0926582,0.885783
-0.00832563,-0.02957,0.697834

,我想把它放入三个gsl_vectors(来自GSL: https://www.gnu.org/software/gsl/doc/html/vectors.html)中,分别对应于X列、Y列和Z列。我想这样做的原因是因为我以后想使用GNU科学库中对这些数据实现的函数。我要强调的是,这些函数只能在gsl_vectors上工作,而不能在std:vectors上工作。

我的方法:

  1. 将。csv中的数据转换为std:vectors,然后将这些vector转换为gsl_vectors。

  2. 将。csv文件中的数据直接放入gsl_vectors中:

    #include <iostream>
    #include <fstream>
    #include <istream>
    #include <string>
    #include <sstream>
    #include <algorithm>
    #include <gsl/gsl_linalg.h>
    #include <gsl/gsl_vector.h>
    struct acceleration {
    gsl_vector AccX;
    gsl_vector AccY;
    gsl_vector AccZ;
    };
    // Function prototypes
    acceleration read_csv(acceleration& A);
    // End function prototypes
    int main(void)
    {
    // ==================READ THE CSV=========================
    acceleration data;
    data = read_csv(data);
    printf("/n");
    gsl_vector_fprintf(stdout, &data.AccX, "%lf");
    return 0;
    }
    acceleration read_csv(acceleration& SA)
    {
    std::string buffer; /* Declare a buffer for the data that will be read */
    std::string bacx, bacy, bacz;
    std::ifstream inputfile;
    inputfile.open("buffer.csv"); /* Open file for reading */
    if (!inputfile.is_open())
    {
    std::cout << "Error opening file" << std::endl;
    }
    std::stringstream aux(buffer);
    getline(aux, bacx, ',');
    getline(aux, bacy, ',');
    getline(aux, bacz, ',');
    size_t i{ 0 };
    while (getline(inputfile, buffer))
    {
    std::stringstream aux(buffer);
    getline(aux, bacx, ',');
    if (bacx.compare("AX") != 0)
    gsl_vector_set(&SA.AccX, i, stod(bacx));
    getline(aux, bacy, ',');
    if (bacy.compare("AY") != 0)
    gsl_vector_set(&SA.AccY, i, stod(bacy));
    getline(aux, bacz, ',');
    if (bacz.compare("AZ") != 0)
    gsl_vector_set(&SA.AccZ, i, stod(bacz));
    i++;
    }
    inputfile.close();
    return (SA);
    }
    

    这在控制台上没有输出,如果我调试它,函数gsl_vector_set抛出一个异常:

    在program .exe中的0x7A5EED1A (gsld.dll)抛出异常:0xC0000005:访问冲突写入位置0x3333332

    gsl_set_vector的线上:v->data[i * v->stride] = x;

  3. 将.csv数据放入gsl_block中,然后将其切片为gsl_vectors。在这里,当我试图将数据放入块中时,我得到了一个异常。然后,为了将块切成向量,我假设我必须使用gsl_vector_alloc_from_block()函数,但是我没有找到关于如何使用此函数的任何示例。我确实需要了解其他人是如何使用函数的,因为我是c++的新手。以下是我到目前为止对这个想法的看法:

    #include <iostream>
    #include <fstream>
    #include <gsl/gsl_linalg.h>
    #include <gsl/gsl_vector.h>
    // Function prototypes
    gsl_block read_csv(void);
    // End function prototypes
    int main(void)
    {
    // ================== READ THE CSV INTO A BLOCK =========================
    gsl_block data;
    data = read_csv();
    // ================= NOW SLICE THE BLOCK: HOW? ==========================
    // Use gsl_vector_alloc_from_block(), but how?
    return 0;
    }
    // Function declarations
    gsl_block read_csv(void)
    {
    FILE* inputfile;
    fopen_s(&inputfile, "buffer.csv", "r"); /* Open file for reading */
    if (inputfile == NULL)
    std::cout << "file does not exist n";
    fseek(inputfile, 0L, SEEK_END); // Go until the end
    int file_size = ftell(inputfile); // In order to tell the size of the file
    gsl_block* b = gsl_block_alloc(file_size);
    if(inputfile)
    gsl_block_fscanf(inputfile, b);
    fclose(inputfile);
    return *b;
    }
    // End function declarations
    

    如果我运行这个,我得到:

    调试错误!Abort()被调用

    在控制台上显示:

    gsl: C:DEVvcpkgbuildtreesgslsrcgsl-2-fb511965d5.cleanblockfprintf_source.c:90: ERROR: fscanf失败调用默认的GSL错误处理程序。

    如果我调试这个,gsl_error函数抛出一个异常:

    prop .exe触发断点。

    Atabort ();

总之,我实际上想将.csv文件读取到gsl_vectors中。如果我的方法不好,也是可以理解的。

您可以通过以下方式将CSV文件读取为gsl矢量:

#include <stdio.h>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <gsl/gsl_vector.h>
int main ()
{
int i = 0, rows = 7;
// Allocate vectors
gsl_vector *X = gsl_vector_alloc (rows);
gsl_vector *Y = gsl_vector_alloc (rows);
gsl_vector *Z = gsl_vector_alloc (rows);
// Open the file
std::ifstream openfile("data.csv");
openfile.ignore(10000, 'n'); // Ignore the header
std::string line;
while (getline(openfile, line, 'n'))
{
std::string a, b, c;
std::stringstream iss(line);
getline(getline(getline (iss, a, ','), b, ','), c, ',');
// std::cout << a << ' ' << b << ' ' << c << std::endl;
// Set vectors
gsl_vector_set (X, i, std::stod(a));
gsl_vector_set (Y, i, std::stod(b));
gsl_vector_set (Z, i, std::stod(c));
i += 1;
}
// Close the file
openfile.close();
for(i = 0; i < rows; ++i)
{
// Get vectors
std::cout << gsl_vector_get (X, i) << "t";
std::cout << gsl_vector_get (Y, i) << "t";
std::cout << gsl_vector_get (Z, i) << "n";
}
// Do some processing with the vectors
// Free allocated memory at the end
gsl_vector_free (X);
gsl_vector_free (Y);
gsl_vector_free (Z);
return 0;
}

首先,我使用ifstream打开data.csv,并将每行读取为三个变量(通过逗号分隔它们)。其次,我将它们转换为double并将它们存储在gsl向量中。最后,我打印它们以进行验证。

相关内容

  • 没有找到相关文章

最新更新