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

妖哥来,如果你也不能帮忙解决,这个有关问题小弟我就不解决了

2012-02-08 
妖哥来,如果你也不能帮忙解决,这个问题我就不解决了以下内容全部都是用代码实现的哈。。。现在我有一个TXT,un

妖哥来,如果你也不能帮忙解决,这个问题我就不解决了
以下内容全部都是用代码实现的哈。。。

现在我有一个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);

热点排行