Как подойти к синтаксическому анализу CSV в Javascript

(Мой первый пост, прошу прощения за ошибки)

Я работаю с небольшим набором данных в файлах CSV, которые мне нужно прочитать, обработать и затем экспортировать в виде текстового файла.

Формат данных CSV:

REGO,STATUS,SHIFT,LOCATION,LOADED
CCA4110,StatusON,5:43,Brisbane,1
CCA4112,StatusON,5:44,Syndey,0
CCA4118,StatusON,6:11,Melbourne,1

Я хочу иметь возможность брать каждую строку после строки заголовка и проверять

a) если значение LOADED равно 0 или 1 (переход к следующей строке, если 1).

б) Если «LOADED» равно 0, то проверьте, соответствует ли значение «REGO» заранее определенному списку значений «REGO».

c) Если совпадение, измените время «SHIFT».

г) Если совпадений нет, переходите к следующей строке.

После этого я хочу экспортировать все строки только со значениями «REGO» и «SHIFT», чтобы они выглядели так:

CCA4110,5:43
CCA4112,5:33
...

Поскольку мне это кажется немного сложным, мне сложно представить, как лучше всего подойти к этой проблеме. Мне было интересно, может ли кто-нибудь помочь мне подумать об этом так, чтобы не просто собрать вместе дюжину вложенных циклов for.

Спасибо большое,

Лиам

Обновлено: вопрос о проверке нескольких условий:

Скажем, у меня есть два файла CSV:

List_to_Change.csv

REGO,STATUS,SHIFT,LOCATION,LOADED       
CCA2420,StatusOn,11:24,BRISBANE,1
CCA2744,StatusOn,4:00,SYDNEY,1
CCA2009,StatusOn,4:00,MELBOURNE,0

List_to_Compare.csv

REGO,CORRECT_SHIFT
CCA2420,6:00
CCA2660,6:00
CCA2009,5:30

Алгоритм:

1. Проверить значение в столбце 'List_to_Check.csv' 'LOADED'

A. Если значение равно «0», перейдите к шагу 2.

B. Если значение равно «1», пропустите эту строку и перейдите к следующей.

2. Проверить, отображается ли значение REGO в List_to_Check.csv в List_to_Compare.csv

A. Если true, переходите к шагу 3.

B. Если false, пропустите эту строку и перейдите к следующей.

3. Измените значение 'SHIFT' в 'List_to_Change.csv' на значение, показанное в 'List_to_Compare.csv'

4. Строка для каждой строки, которая была изменена, и экспорт в текстовый файл.

Это может помочь вам получить подсказку: stackoverflow.com/questions/7431268/…. В любом случае, речь идет просто о разделении строки, вы что-нибудь пробовали или ищете теоретический подход?

briosheje 15.10.2018 13:26

@briosheje Большое спасибо за ресурс, сейчас проверю. У меня было несколько попыток, разделение ввода на основе возврата каретки, а также попытки (и безуспешные) понять, как использовать Papa Parse для обработки файла. Думаю, меня больше интересует, есть ли более разумный способ взглянуть на проблему. Еще раз спасибо

Liam Johnson 15.10.2018 13:35

Пожалуйста, поделитесь выше попыткой (то есть кодом), о которой вы говорите, это было бы хорошей отправной точкой и удовольствием помочь вам, начиная с ввода ваш;)

briosheje 15.10.2018 13:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
92
1

Ответы 1

Я бы посоветовал разделить рабочий процесс на три этапа:

  1. Разобрать все строки на объекты javascript
  2. Выполните логику на массиве объектов
  3. Вернуть объекты в CSV

// This creates an object based on an order of columns:
const Entry = ([rego, status, shift, location, loaded]) =>
  ({ rego, status, shift, location, loaded });
  
// Which entries are we interested in?
const shouldHandleEntry = ({ loaded }) => loaded === "1";

// How do we update those entries?
const updateEntry = entry => ({
  ...entry,
  shift: ["CCA4118"].includes(entry.rego)
    ? "5:33"
    : entry.shift
});

// What do we export?
const exportEntry = ({ rego, shift }) => `${rego},${shift}`;

// Chain the steps to create a new table:
console.info(
  csvBody(getCSV())
    .map(Entry)
    .filter(shouldHandleEntry)
    .map(updateEntry)
    .map(exportEntry)
    .join("\n")
)


// (This needs work if you're using it for production code)
function csvBody(csvString) {
  return csvString
    .split("\n")
    .map(line => line.trim().split(","))
    .slice(1);
};

function getCSV() { return `REGO,STATUS,SHIFT,LOCATION,LOADED
CCA4110,StatusON,5:43,Brisbane,1
CCA4112,StatusON,5:44,Sydney,0
CCA4118,StatusON,6:11,Melbourne,1`; }

Это невероятно и невероятно близко к тому, что я пытался донести. Большое спасибо за то, что уделили этому время. Я уже многому могу научиться, читая то, что вы написали. Это имеет смысл, если я хочу проверить одно условие, например "Location = 1." Скажем, я хотел проверить несколько условий, как лучше всего подойти к этому? Я отредактировал основной пост с примером для ясности. Не могли бы вы взглянуть?

Liam Johnson 16.10.2018 00:23

Это требует замены шага updateEntry. Вместо статической функции нам нужно создать функцию обновления, основанную на изменениях в другом файле. Указатель: создайте объект REGO: CORRECT_SHIFT, для каждой записи, которую необходимо проверить, проверьте, есть ли исправленное значение в этом объекте, и обновите его соответствующим образом.

user3297291 18.10.2018 10:16

Другие вопросы по теме