1

从一开始就。

我在 csv 文件中有数据,例如:

La Loi des rues,/m/0gw3lmk,/m/0gw1pvm
L'Étudiante,/m/0j9vjq5,/m/0h6hft_
The Kid From Borneo,/m/04lrdnn,/m/04lrdnt,/m/04lrdn5,/m/04lrdnh,/m/04lrdnb

等等

这是 UTF-8 格式。我按如下方式导入此文件(取自其他地方):

feature('DefaultCharacterSet','UTF-8');
fid = fopen(filename,'rt');         %# Open the file
  lineArray = cell(100,1);          %# Preallocate a cell array (ideally slightly
                                    %# larger than is needed)
  lineIndex = 1;                    %# Index of cell to place the next line in
  nextLine = fgetl(fid);            %# Read the first line from the file
  while ~isequal(nextLine,-1)       %# Loop while not at the end of the file
  lineArray{lineIndex} = nextLine;  %# Add the line to the cell array
  lineIndex = lineIndex+1;          %# Increment the line index
  nextLine = fgetl(fid);            %# Read the next line from the file
end
fclose(fid);                        %# Close the file

这将创建一个包含 UTF-8 文本的数组。{3x1} 数组:

'La Loi des rues,/m/0gw3lmk,/m/0gw1pvm'
'L''Étudiante,/m/0j9vjq5,/m/0h6hft_'
'The Kid From Borneo,/m/04lrdnn,/m/04lrdnt,/m/04lrdn5,/m/04lrdnh,/m/04lrdnb'

现在下一部分将每个值分成一个数组:

lineArray = lineArray(1:lineIndex-1);              %# Remove empty cells, if needed
  for iLine = 1:lineIndex-1                        %# Loop over lines
    lineData = textscan(lineArray{iLine},'%s',...  %# Read strings
                        'Delimiter',',');
    lineData = lineData{1};                        %# Remove cell encapsulation
    if strcmp(lineArray{iLine}(end),',')           %# Account for when the line
      lineData{end+1} = '';                        %# ends with a delimiter
    end
    lineArray(iLine,1:numel(lineData)) = lineData; %# Overwrite line data
  end

这输出:

'La Loi des rues'   '/m/0gw3lmk'    '/m/0gw1pvm'    []  []  []
'L''�tudiante'  '/m/0j9vjq5'    '/m/0h6hft_'    []  []  []
'The Kid From    Borneo'    '/m/04lrdnn'    '/m/04lrdnt'    '/m/04lrdn5'    '/m/04lrdnh'    '/m/04lrdnb'

问题是 UTF-8 编码丢失了textscan(注意我现在得到的问号,而在前面的数组中它很好)。

问题:在将 {3x1} 数组转换为 3xN 数组时,如何维护 UTF-8 编码。

我找不到任何关于如何将 UTF-8 编码保存textscan在工作区中已有的数组中的信息。一切都与导入我没有问题的文本文件有关 - 这是第二步。

谢谢!

4

2 回答 2

1

试试下面的代码:

%# read whole file as a UTF-8 string
fid = fopen('utf8.csv', 'rb');
b = fread(fid, '*uint8')';
str = native2unicode(b, 'UTF-8');
fclose(fid);

%# split into lines
lines = textscan(str, '%s', 'Delimiter','', 'Whitespace','\n');
lines = lines{1};

%# split each line into values
C = cell(numel(lines),6);
for i=1:numel(lines)
    vals = textscan(lines{i}, '%s', 'Delimiter',',');
    vals = vals{1};
    C(i,1:numel(vals)) = vals;
end

结果:

>> C
C = 
    'La Loi des rues'        '/m/0gw3lmk'    '/m/0gw1pvm'              []              []              []
    'L'Étudiante'            '/m/0j9vjq5'    '/m/0h6hft_'              []              []              []
    'The Kid From Borneo'    '/m/04lrdnn'    '/m/04lrdnt'    '/m/04lrdn5'    '/m/04lrdnh'    '/m/04lrdnb'

请注意,当我对此进行测试时,我将输入 CSV 文件编码为“没有 BOM 的 UTF-8”(我使用 Notepad++ 作为编辑器)

于 2012-07-24T17:52:43.783 回答
0

尝试使用以下fopen命令而不是您当前的命令。它为文件指定 UTF-8 编码。

f = fopen(filename,'rt', 'UTF-8');

您也可以使用它来缩短一些代码:

text = fscanf(f,'%c');
Lines = textscan(text,'%s','Delimiter',',');

这可能有助于减轻您在那里进行的一些预分配。

于 2012-07-24T17:48:35.203 回答