C++ 使用MS文本驱动程序/CDATA库解析CSV文件

C++ 使用MS文本驱动程序/CDATA库解析CSV文件,c++,C++,我有一个CSV文件,我正在尝试处理,看起来类似于下面的一个。这种格式已经在遗留软件中使用,所以很遗憾,我无法更改它。如您所见,该文件分为两个部分—在本例中,一部分用于项目,另一部分用于这些项目中的零件 ID,Description,Make,Model,Serial,Parts 200,Fridge,Samsung,S4450,SX05948596,1x34.4x22 354,Dishwasher,Bobs,BB45,BFDD34848,3x34.1x55.4x2 ENDITEMS STARTP

我有一个CSV文件,我正在尝试处理,看起来类似于下面的一个。这种格式已经在遗留软件中使用,所以很遗憾,我无法更改它。如您所见,该文件分为两个部分—在本例中,一部分用于项目,另一部分用于这些项目中的零件

ID,Description,Make,Model,Serial,Parts
200,Fridge,Samsung,S4450,SX05948596,1x34.4x22
354,Dishwasher,Bobs,BB45,BFDD34848,3x34.1x55.4x2
ENDITEMS
STARTPARTS
ID,Description,Price,Created
34,Bolt,4.33,08/05/15
22,Nut,1.20,10/10/12
ENDPARTS
我目前正试图使用Microsoft文本驱动程序和CDATA库来解析文件,但遇到了一个问题。引擎似乎与一些字段混淆了使用什么数据类型,特别是第一节和第二节使用不同类型的字段

例如,如果我在索引1(描述)上调用
recordSet.GetFieldValue()
,这很好,它会将其解析为字符串,因为第1节和第2节都使用字符串。如果我在索引4上调用它,我会遇到问题——第一部分索引(模型)使用字符串,但第二部分索引(创建的)使用日期类型。
GetFieldValue()
调用中的结果返回null

我尝试调用
CRecordSet.GetFieldValue(index,CDBVariant,SQL_C_CHAR)
强制它以字符串形式读取索引,但仍然返回null。如果可能的话,我想避免在解析之前必须先切碎文件

现在我对C++仍然是相当新的,所以这里可能会有一些明显的错误,但是这里是我的测试代码(<代码> PrimType()/<代码>方法,只打印CDBVALIONTS的类型和值):

CString fileDir=“C:\\”; CString fileName=“test.CSV”; CString构造; CString查询字符串; consting.Format(“驱动程序={Microsoft文本驱动程序(*.txt;*.csv)};DSN=”;DBQ=%s;”,fileDir); 格式(“选择[%s]中的*项”,文件名); CDatabase数据库; 录音机; rs.m_pDatabase=&db; db.OpenEx(施工); if(rs.Open(AFX\U DB\U USE\U DEFAULT\U TYPE,查询字符串)) { int count=rs.GetODBCFieldCount(); for(int i=0;iSTD::你绝对需要使用MS文本驱动程序吗?如果字符串不包含分隔符本身,那么标准的C++解析程序就不难编写了。请看这里:我想我不必这样做了。我只是希望我在代码< > GETFieldValue>中误用了一些小的代码,比如误用<代码> SqLyCyChar < /Cube >。。阅读文档时,我假设SQL\u C\u CHAR做了我想做的事情。我想有一种方法可以做你想做的事情,但是这个特定的API似乎没有很大的用户基础,经过表面的搜索,文档看起来很稀疏。有很多关于简单文本解析的在线问题,这应该会让你的工作更容易你
CString fileDir = "C:\\";
CString fileName = "test.CSV";
CString conString; 
CString queryString;

conString.Format("DRIVER={Microsoft Text Driver (*.txt; *.csv)};DSN='';DBQ=%s;", fileDir);
queryString.Format("SELECT * FROM [%s]", fileName);

CDatabase db;
CRecordset rs;
rs.m_pDatabase = &db;

db.OpenEx(conString);
if (rs.Open(AFX_DB_USE_DEFAULT_TYPE, queryString))
{
    int count = rs.GetODBCFieldCount();

    for (int i = 0; i < count; i++)
    {
        CODBCFieldInfo fieldInfo;
        rs.GetODBCFieldInfo(i, fieldInfo);

        CDBVariant varValue;
        rs.GetFieldValue(i, varValue, SQL_C_CHAR);

        std::cout << i << " " << fieldInfo.m_strName << ":\t";
        printType(&varValue);
        std::cout << std::endl;
    }
}