Как удалить пустые ячейки из CSV при анализе CSV с помощью PapaParse? - PullRequest
0 голосов
/ 12 марта 2020

Или, если сформулировать вопрос иначе: почему ParseResult.data PapaParse является пустым массивом при обрезке всех начальных и конечных пустых ячеек во время функции Papa.step()? РЕДАКТИРОВАТЬ: Обратите внимание, что я могу достичь того, что я хочу, сопоставляя проанализированные результаты и обрезку, но я не хочу анализировать и затем отображать, я бы предпочел сделать все это в одном go.

Пример CSV:

Col 1,Col 2,Col 3
1-1,1-2,
,2-2,2-3
3-1,3-2,3-3

Обратите внимание, что строка 1 содержит заголовки (столбец 1, столбец 2 и т. Д. c). Строка 2, столбец 3 пуста, а строка 3, столбец 1 пуста.

Учитывая, что CSV, я хочу представить это обратно пользователю (в виде красиво отформатированной таблицы):

|     |     |     |
|-----|-----|-----|
| 1-1 | 1-2 |     |
| 2-2 | 2-3 |     |
| 3-1 | 3-2 | 3-3 |

Я хочу набрать sh все строки как можно дальше влево go и удалить все пустые ячейки в конце каждой строки.

Другими словами, я хочу обрезать все пустые ячейки в начале и конце каждой строки. Ниже приведен код, который я использую. Я поместил отладчики в trimEmptyCells, и он работает точно так, как ожидалось. Однако ParseResult, который возвращает parseAndTrim, содержит пустой массив data.

export const parseAndTrim = (csv: string): Papa.ParseResult => {
    return Papa.parse(csv, {
        skipEmptyLines: true,
        step: trimEmptyCells,
    })
};

const trimEmptyCells = (results: Papa.ParseResult) => {
    // Note that `_.dropWhile` and `_.dropRightWhile` are [lodash
    // functions](https://lodash.com/docs/4.17.15#dropRight).
    const leftTrimmed = _.dropWhile(results.data, (r) => r === "");
    return _.dropRightWhile(leftTrimmed, (r) => r === "");
};

Моим первым предположением было то, что PapaParse испытывал ошибки с массивами различной длины, но массив errors также пуст , Таким образом, я протестировал то, что мог (без функции step) на https://www.papaparse.com/demo, используя приведенный ниже пример, и просто наличие пропущенных ячеек (не просто пустых) не выдает ошибок и возвращает правильное значение data массив.

Пример тестового ввода при https://www.papaparse.com/demo

Col 1,Col 2,Col 3
1-1,1-2
,2-2,2-3

1 Ответ

0 голосов
/ 14 марта 2020

На основании этого комментария из pokoli (участник № 2 в PapaParse и участник № 1 с начала 2017 года), я считаю, что это невозможно. Pokoli предлагает следующее решение:

. Вы должны использовать Papa.parse для чтения записей в виде массива, отфильтровать их и затем использовать Papa.Unparse для записи второго файла.

I wi sh Я мог бы изменять данные при анализе, чтобы быть быстрее, но PapaParse очень быстрый. Я был в состоянии разобрать 36 000 строк CSV менее чем за 300 мс, и разобрать в два раза быстрее. Разбор CSV на 2000 строк занял меньше 30 мс, а разбор снова занял вдвое больше времени. Мой вариант использования будет включать CSV менее 2000 строк в 99% случаев, поэтому анализ в 2d массиве, фильтрация, повторный анализ обратно в CSV, а затем повторный анализ в json не займет слишком много времени.

...