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

listview读csv双引号号逗号分隔数据解决方法

2012-06-12 
listview读csv双引号号逗号分隔数据各位高手好,我在csv文件中的数据如下:C43,CAP1,58.039mm,84.582

listview读csv双引号号逗号分隔数据
各位高手好,我在csv文件中的数据如下:
"C43","CAP1","58.039mm","84.582mm","58.039mm","80.772mm","58.039mm","80.772mm","T","360.00","CAP1"
"C41","CAP1","36.195mm","84.582mm","36.195mm","80.772mm","36.195mm","80.772mm","T","360.00","CAP1"
"C40","CAP1","58.039mm","70.358mm","58.039mm","66.548mm","58.039mm","66.548mm","T","360.00","CAP1"
想把它读进listview中,ccrun版主写的程序我稍微做了点修改如下:

C/C++ code
TStringList *lst = new TStringList;lst->LoadFromFile("D:\\ccrun\\a.csv");String strLine, str;int n = 0;for (int i = 0; i < lst->Count; i++){    strLine = lst->Strings[i];    TListItem *li = ListView1->Items->Add();    while (strLine.Pos(","))    {        str = strLine.SubString(1, strLine.Pos(",") - 2);        if (str.Length() > 2 && str[str.Length()] == 'm'                && str[str.Length() - 1] == 'm')            str = str.SubString(1, str.Length() - 2);        strLine = strLine.SubString(strLine.Pos(",") + 2, strLine.Length());        if (li->Caption.Length() < 1)        {            li->Caption = str;            n = 0;        }        else        {            if (n < 4 || n > 7)                li->SubItems->Add(str);        }        n++;    }    if (li->Caption.Length() < 1)        li->Caption = strLine;    else        li->SubItems->Add(strLine);}delete lst;

运行程序后,在listview中显示如下:
"C43,CAP1,58.039,84.582,T,360.00,CAP1"
"C41,CAP1,36.195,84.582,T,360.00,CAP1"
"C40,CAP1,58.039,70.358,T,360.00,CAP1"
我想要把输出的每一行的两边的双引号"去掉,即变成如下的输出形式:
C43,CAP1,58.039,84.582,T,360.00,CAP1
C41,CAP1,36.195,84.582,T,360.00,CAP1
C40,CAP1,58.039,70.358,T,360.00,CAP1
弄了好长时间了,没有调试成功。请高手指点,谢谢!

[解决办法]
部分代码:
for (int i = 0; i < lst->Count; i++)
{
strLine = lst->Strings[i];

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

if(strLine.Pos("\"")==1) strLine= strLine.SubString(2, strLine.Length()- 1); //add
while (strLine.Pos(","))
{
str = strLine.SubString(1, strLine.Pos(",") - 2);
if (str.Length() > 2 && str[str.Length()] == 'm'
&& str[str.Length() - 1] == 'm')
str = str.SubString(1, str.Length() - 2);

//strLine = strLine.SubString(strLine.Pos(",") + 2, strLine.Length());
strLine = strLine.SubString(strLine.Pos(",") + 2, strLine.Length()-2);
if (li->Caption.Length() < 1)
{
li->Caption = str;
n = 0;
}
else
{
if (n < 4 || n > 7)
li->SubItems->Add(str);
}
n++;
}

if(strLine.Length()>1) strLine = strLine.SubString(1, strLine.Length()-1); //add
if (li->Caption.Length() < 1)
li->Caption = strLine;
else
li->SubItems->Add(strLine);
}
[解决办法]
"C43 ->C43
CAP1"->CAP1
一个简单的字符串去掉 " 的操作
你上面的代码不看了, 至于你怎么弄成这样我更不看了
我就只眼前的结果 通过这个字符串操作来给你分析下:
从你结果可以发现 取每行的第一个元素 前面多了一个 ",取每行最后一个元素的时候 后面多了一个 "
这就是规律
所以取第一个和最后一个元素的时候 处理下就行了
相信这么一说你应该知道怎么做了
 


下面简单的字符串操作 
 AnsiString Str = "\"C43" ;
 Str = Str.SubString(2,Str.Length()-1);
 ShowMessage(Str); // C43
 Str = "CAP1\"" ;
 Str = Str.SubString(1,Str.Length()-1);
 ShowMessage(Str); //CAP1

热点排行