Babel plugin: какая разница между & ldquo; transform-object-rest-spread & rdquo; и & ldquo; синтаксис-объект-отдых-распространение & rdquo;

В случае, когда вы знаете, сколько столбцов данных будет в вашем CSV-файле, один простой вызов textscan , подобный Amro, предполагает, что будет вашим лучшим Решение.

Однако, если вы не знаете a priori , сколько столбцов находится в вашем файле, вы можете использовать более общий подход, как я сделал в следующей функции. Я сначала использовал функцию fgetl , чтобы прочитать каждую строку файла в массиве ячеек. Затем я использовал функцию textscan для синтаксического анализа каждой строки в отдельных строках с использованием предопределенного разделителя полей и обработки целочисленных полей как строк на данный момент (их можно преобразовать в числовые значения позже). Вот результирующий код, помещенный в функцию read_mixed_csv:

function lineArray = read_mixed_csv(fileName, delimiter)

  fid = fopen(fileName, 'r');         % 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

  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', delimiter);
    lineData = lineData{1};                          % Remove cell encapsulation
    if strcmp(lineArray{iLine}(end), delimiter)      % Account for when the line
      lineData{end+1} = '';                          %   ends with a delimiter
    end
    lineArray(iLine, 1:numel(lineData)) = lineData;  % Overwrite line data
  end

end

Запуск этой функции в содержимом образцового файла из вопроса дает следующий результат:

>> data = read_mixed_csv('myfile.csv', ';')

data = 

  Columns 1 through 7

    '04'    'abc'    'def'    'ghj'    'klm'    ''            ''        
    ''      ''       ''       ''       ''       'Test'        'text'    
    ''      ''       ''       ''       ''       'asdfhsdf'    'dsafdsag'

  Columns 8 through 10

    ''          ''    ''
    '0xFF'      ''    ''
    '0x0F0F'    ''    ''

результатом является массив размером 3 на 10 с одним полем на ячейку, где отсутствующие поля представлены пустой строкой ''. Теперь вы можете получить доступ к каждой ячейке или комбинации ячеек, чтобы форматировать их по своему усмотрению. Например, если вы хотите изменить поля в первом столбце от строк до целых значений, вы можете использовать функцию str2double следующим образом:

>> data(:, 1) = cellfun(@(s) {str2double(s)}, data(:, 1))

data = 

  Columns 1 through 7

    [  4]    'abc'    'def'    'ghj'    'klm'    ''            ''        
    [NaN]    ''       ''       ''       ''       'Test'        'text'    
    [NaN]    ''       ''       ''       ''       'asdfhsdf'    'dsafdsag'

  Columns 8 through 10

    ''          ''    ''
    '0xFF'      ''    ''
    '0x0F0F'    ''    ''

Обратите внимание, что пустые поля приводят к значениям NaN .

0
задан Littlee 13 July 2018 в 08:29
поделиться

1 ответ

У нас есть документы об этом здесь: https://babeljs.io/docs/en/plugins#syntax-plugins

-syntax- плагины активируют только синтаксис правильно разобрать и вообще не преобразовывать код. Обычно вам не нужно указывать это, если только для него не нужно правильно разбираться.

-трансформаторы-плагины позволяют использовать синтаксис, а также преобразовывать код для вас.

Вы хотите используйте babel-plugin-transform-object-rest-spread, если вы используете Babel v6.

2
ответ дан hzoo 17 August 2018 в 13:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: