首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

TStringList分割CSV文件成两部分添入ListView提示“越界”,该如何解决

2012-05-07 
TStringList分割CSV文件成两部分添入ListView提示“越界”csv文件如下:R7,RESPACK-4,117.42mm,10.51m

TStringList分割CSV文件成两部分添入ListView提示“越界”
csv文件如下:
"R7","RESPACK-4","117.42mm","10.51mm","118.74mm","11.24mm","118.75mm","11.26mm","T","90.00","4.7K"
"C6","RESPACK-4","140.94mm","43.37mm","140.28mm","44.74mm","140.28mm","44.74mm","T","0.00","4.7K"
我只要前2列和后5列的数据(即上面黑体部分),我采用TStringList分割,并显示在ListView中,代码如下:

C/C++ code
if(OpenTextFileDialog1 -> Execute())    {    csvFile -> LoadFromFile(OpenTextFileDialog1 -> FileName);    for(int i = 0; i < csvFile -> Count; i++)   // i表示行        {        csvCol -> Delimiter = ',';        csvCol -> DelimitedText = csvFile -> Strings[i];        TListItem *csvlist = ListView1 -> Items -> Add();        csvlist -> Caption = csvCol -> Strings[0];        for(int j = 1; j < csvCol -> Count - 9; j++) // j表示前2列, 共11列            {            ListView1 -> Items -> Item[i] -> SubItems -> Add(csvCol -> Strings[j]);            }        for(int k = 7; k < csvCol -> Count; k++)  // k表示后5列, 共11列            {            ListView1 -> Items -> Item[i] -> SubItems -> Add(csvCol -> Strings[k]);            }        }    }

但总是提示List index out of bounds(0),越界了。个人实在搞不定了,还请高手给指点一二,非常感谢!

[解决办法]
改成这样试试?
 for(int j = 1; j < csvCol -> Count - 9; j++) // j表示前2列, 共11列
{
csvlist -> SubItems -> Add(csvCol -> Strings[j]);
}
for(int k = 7; k < csvCol -> Count; k++) // k表示后5列, 共11列
{
csvlist -> SubItems -> Add(csvCol -> Strings[k]);
}
}
[解决办法]
if( OpenTextFileDialog1->Execute() )
{
csvFile->LoadFromFile(OpenTextFileDialog1->FileName);

for(int i=0; i<csvFile->Count; i++) // i表示行
{
if ( csvFile->Strings[i].Length() > 10 ) // 这里过滤一下源文件中的空行或者不正确的行
{
csvCol->Clear();
csvCol->Delimiter = ',';
csvCol->DelimitedText = csvFile->Strings[i];

TListItem *csvlist = ListView1->Items->Add();

csvlist->Caption = csvCol->Strings[0];

for(int j=1; j < csvCol->Count-9; j++) // j表示前2列, 共11列
{
csvlist->SubItems->Add(csvCol->Strings[j]); // 这里,直接使用刚才创建的 LitItem 指针
}

for(int k = 6; k < csvCol->Count; k++) // k表示后5列, 共11列 // 这里有个错误,索引号不对,不是7,应该是6
{
csvlist->SubItems->Add(csvCol->Strings[k]); // 这里,直接使用刚才创建的 LitItem 指针
}
}

}
}

热点排行