在MFC中读取.CSV文件内容

Read .CSV file contents in MFC

本文关键字:文件 CSV 读取 MFC      更新时间:2023-10-16

大家好,我是C MFC初学者,我希望通过继承CSTDIOFILE类在C MFC中读取.CSV文件内容的帮助。

该文件具有这样的数据:

aaaaaaaaa; bbbbbbb; ccccccc; dddddddd;eeeeeeee; ffffffff;等...

aaaaaaaa是直接没有"的字符串例如:test1; test2; ...

并在现实中表示excel中的值。

我想要的是创建一个带有两个参数(行和列)的新读取器函数,它们读取到文件中并提取良好的值并将其返回为cstring

目前,这是我拥有的代码:

CString ReadData(int rl, int rc)
{
    CString sLine;
    LPCTSTR p = sLine;
    unsigned int i=1;
    unsigned int j=1;
    CString s;
    while(*p!= EOF)
    {
        if(*p==';' && i==rl)
            s.AppendChar(*p);
        if(*p=='n')
            i++;
        p++;
    }
    return s;
}

这尚未工作,尚未完成。

我想要什么帮助知道在文件中执行此操作的方法,如何检测文件的末尾(这是正常的eof值?),line的结尾(' n'?),我是否必须将不同的字符串在一行中库存?当然,也欢迎代码中的一些帮助。

一次读取文件一个字符很慢,您可以在一个字符串中以较大的块读取。只要文件不太大,就可以使用。然后将该字符串归为不同的行,并将每一行将每行归为不同的字段。

顺便说一句,您要求"半彩分离值"而不是CSV,因此将','更改为';'

void tokenize(vector<CStringA> &v, const CStringA &source, char token)
{
    for (int start = 0, len = source.GetLength(); start < len;)
    {
        int end = source.Find(token, start);
        if (end < 0) end = len;
        v.push_back(source.Mid(start, end - start));
        start = end + 1;
    }
}
void foo()
{
    CStringA source; //read the whole file in to one string "source"
    const int bufsize = 512 + 1;
    char buf[bufsize];
    CFile file("files.csv", CFile::modeRead|CFile::typeBinary);
    int count;
    while ((count = file.Read(buf, bufsize - 1)) > 0) {
        buf[count] = 0;
        source += buf;
    }
    source.Remove('r');
    vector<CStringA> lines; //tokenize in to separate lines and store in vector
    tokenize(lines, source, 'n'); 
    for (int row = 0; row < (int)lines.size(); row++) {
        vector<CStringA> fields; //tokenize in to different fields
        tokenize(fields, lines[row], ',');
        for (int column = 0; column < (int)fields.size(); column++)
            TRACE("%s|", fields[column]); //print each field for testing
        TRACE("n");
    }
}