FAQ > 金融建模 > 第三方交互 > Excel

Q:导入csv文件中的数据出现乱码    

  • A:数据源文件格式为CSC UTF-8(逗号分隔)(*.csv)时,使用ftcsv()模式进行导入后,结果中的中文出现乱码现象。
    原因是:天软客户端为gbk编码,用户通过以前的ftcsv()模式导入UTF8 bom格式后,中间数据处理没有进行转换,导致乱码现象。

    解决办法:
    1、目前最新的客户端版本(2023-12-04日更新)已支持ftcsv()模式下处理uft8 bom格式,解决了乱码的问题,用户可选择升级客户端到最新版本后使用。(此方式为主推模式)
     相关升级说明:FAQ:2023-12-4客户端升级说明:ftcsv模式支持utf8 bom格式csv

    升级客户端到2023-12-04日版本,关于乱码现象的前后对比:
    测试代码:
    LJ:="C:\\Test\\File\\2023-12\\20231204.csv";
    rdo2 importfile(ftcsv(),"",LJ,t);
    return t;

    源文件在保存时,保存类型为UTF-8格式,如下所示

    升级前导入结果:

    升级后导入结果:解决乱码问题


    2、若不想升级客户端,则用户可封装相关模型对编码进行转码处理,例如下:

    封装模型ImportCSV(ft,path,data)替代importfile,加一层对csv编码的判断与处理,实现如下:
    (注:该deom只实现了importfile的基础功能,用户若还要更多导入的功能,可在此基础上进行增加实现,下列代码供用户参考)
    Function ImportCSV(ft,path,data);
    begin
      size:=filesize("",path);
      Ret:=readfile(rwBinary(),'',path,0,size,data);

      //判断是否utf-8 bom头,转成ANSI格式的CSV文件,
      if ft=ftcsv() and (length(data)>3) and (ord(data[0])=0xef) and (ord(data[1])=0xbb) and (ord(data[2])=0xbf) then
      begin
        try
          s:=UTF8ToAnsi(data[3:]);

          sArr:=str2array(s,"\r\n");
          r:=array();
          for i:=0 to length(sArr)-1 do
          begin
            if trim(sArr[i])<>'' then
             r[i]:=str2array(sArr[i],",");
          end
          rc:=r[0];//--默认第一行为列标
          r:=r[1:];
          reindex(r,nil,rc);
          data:=r;
        except
          return ExceptObject.ErrInfo;
        end;
      end
      else ret:=importfile(ft,"",path,data);
      return ret;
    end

    执行导入操作:
    LJ:="C:\\Test\\File\\2023-12\\20231204.csv";
    r:= rdo2 ImportCSV(ftcsv(),LJ,data);
    echo r;
    return t;

    导入结果: