妖哥来,如果你也不能帮忙解决,这个问题我就不解决了
以下内容全部都是用代码实现的哈。。。
现在我有一个TXT,unicode编码的。
然后我想打开的并且以excel的打开方式打开。
对TXT的内容修改后,关掉Excel,根据提示,保存,关闭。
再用TXT的方式打开,发现凡是带逗号的地方都会在两边加上了引号。如下所示
TXT内容 112,233 Excel打开修改之后 TXT内容 "112,233"
这个引号我想了很多办法,都去不掉。最后我只能把整个TXT内容放到一个WideString里面,把所有的引号全部Pos出来,然后去掉。但是这个方法实在是太慢了。而stringreplace又不支持WideString,据说BCB2010支持,但是我现在的网速下载不了BCB2010
妖哥,帮帮忙啊,如果你也没有办法,整个问题,就算了吧。。
[解决办法]
第一个TXT文件
id1 aa bb cc dd
id2 bb cc dd ee
id3 cc dd ee ff
第二个文件
id1 aa aa aa aa
id2 bb bb bb bb
id3 cc cc cc cc
修改第二个文件,使用id 后面的数据与第一个文件一样,这个用程序来做还是比EXCEL快的多.
- C/C++ code
struct T_idData{ void *pdata; int Len ;};
//从缓冲区读入变量,返回 1 成功 2 遇回行,可能行未束或文件束, -1 失(找不到 \t分隔)
int ReadValue(wchar_t *&buff,int Len , WideString &id, T_idData &data,wchar_t *wchar)
{//多一 Len ,是了支持文件中可能的(的文本文件,中有0)。
wchar_t *p = buff ;
int pos= 0 ;
for(int i = 0 ; i < Len ; ++i,++p)
{
if(*p == wchar[0]) //TAB
{
*p = 0 ;
id = buff ;
*p = L'\t';
data.pdata = ++p;
for( pos = ++i; i < Len; ++i,++p)
{
if(*p == wchar[1] || *p == wchar[2]) // \r\n
{
++i,++p;
if(*p == wchar[1] || *p == wchar[2])
++i,++p;
data.Len = i-pos ;
buff = p ;
return 1 ;
}
}
}
}
if(pos > 0 )
{
data.Len = Len - pos ;
return 2 ;
}
return -1 ;
}
void swapwchar(wchar_t *wchar)
{
char *p = (char *)wchar ;
char a = p[0] ;
p[0] = p[1] ;
p[1] = a ;
}
bool Test(TStream* Source , TStream*Source2, TStream*Dest , String &ErrorStr)
{
std::vector <WideString> id2;
std::map <WideString,T_idData> Text1;
WideString id ;
T_idData iddata;
unsigned char *buff = new char[Source->Size];
unsigned char *buff2 = new char[Source2->Size];
Source->Read(buff,Source->Size);//一次入存,不能理太大的文件,十M是可以的
Source2->Read(buff2,Source2->Size);
int Line = 0 ;
int R ;
wchar_t wchar[3];
wchar_t *data ;
wchar[0] = L'\t';
wchar[1] = L'\r';
wchar[2] = L'\n';
if(buff[0] == 0xFF && buff[1] == 0xFE)
{
data = (wchar_t *)(buff +2) ;
swapwchar(&wchar[0]);
swapwchar(&wchar[1]);
swapwchar(&wchar[2]);
}
else if(buff[0] == 0xFE && buff[1] == 0xFE) //windows X86
data = (wchar_t *)(buff +2) ;
else //不理其他格式的 unicode 文件
{
ErrorStr = "未能的文件格式 unicode 文件 ";
goto LABELERROR ;
}
do{
R = ReadValue(data,Source->Size/2 -1 , id, iddata,wchar);
Line++;
if(R == 1 || R == 2 )
Text1[id] = iddata ;
else
{
ErrorStr = "的文件格式,第"+IntToStr(Line)+"行中未TAB分隔符。";
goto LABELERROR ;
}
}while (R == 1);
//文件及格式化束,下面文件: 文件1 文件2 及目文件 其unicode格式要一致
//未理文件1,文件2格式不一致的
data = (wchar_t *)(buff2 +2) ;
Dest->Write(buff,2) ; //文件
do{
R = ReadValue(data,Source2->Size/2 -1 , id, iddata,wchar);
Line++;
if(R == 1 || R == 2 )
{
Dest->Write(id.data(),id.Length()*2);//ID
Dest->Write(&wchar[0],2); //TAB
std::map <WideString,T_idData>::iterator pos = Text1.find(id) ;
if(pos != Text1.end())
{
Dest->Write(pos->second.pdata,pos->second.Len); //DATA
}
else
{
// Dest->Write(iddata.pdata,iddata.Len); //然也可以不作而照不
ErrorStr = ",第"+IntToStr(Line)+"行中出未的ID:" + id;
goto LABELERROR ;
}
}
else
{
ErrorStr = "的文件格式,第"+IntToStr(Line)+"行中未TAB分隔符。";
goto LABELERROR ;
}
}while (R == 1);
LABELERROR:
delete buff ;
delete buff2 ;
return ErrorStr == "" ;
}
我试着写的,你可以修改下.....
使用例子:
TFileStream *fs1 = new TFileStream("Text1.txt",fmOpenRead);
TFileStream *fs2 = new TFileStream("Text2.txt",fmOpenRead);
TFileStream *fs_dest = new TFileStream("Text3.txt",fmCreate );
String ErrorStr;
bool R ;
try{
R = Test(fs1,fs2,fs_dest,ErrorStr);
}
__finally
{
delete fs1 ;
delete fs2 ;
delete fs_dest ;
}
if(R)
ShowMessage("文件完成,查看 Text3");
else
ShowMessage(ErrorStr);