C++ 使用MS文本驱动程序/CDATA库解析CSV文件
我有一个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
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;iCString 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;
}
}