如何在Javascript中解析CSV

如何在Javascript中解析CSV,javascript,jquery,arrays,algorithm,csv,Javascript,Jquery,Arrays,Algorithm,Csv,(我的第一篇帖子,我为任何错误道歉) 我正在处理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) 如果“已加载”值等于0或1(如果为

(我的第一篇帖子,我为任何错误道歉)

我正在处理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) 如果“已加载”值等于0或1(如果为1,则跳到下一行)

b) 如果“LOADED”为0,则检查“REGO”值是否与预定义的“REGO”值列表匹配

c) 如果匹配,请更改“班次”时间

d) 如果没有匹配项,请转到下一行

在这之后,我想导出所有行,只包含'REGO'和'SHIFT'值,如下所示:

CCA4110,5:43
CCA4112,5:33
...
因为这对我来说有点复杂,我很难想象解决这个问题的最佳方法。我想知道是否有人能帮助我思考这个问题,而不仅仅是将一打嵌套for循环拼凑在一起

非常感谢

利亚姆

编辑:关于检查多个条件的问题:

假设我有两个CSV文件:

列表到更改.csv

REGO,STATUS,SHIFT,LOCATION,LOADED       
CCA2420,StatusOn,11:24,BRISBANE,1
CCA2744,StatusOn,4:00,SYDNEY,1
CCA2009,StatusOn,4:00,MELBOURNE,0
REGO,CORRECT_SHIFT
CCA2420,6:00
CCA2660,6:00
CCA2009,5:30
列出要比较的内容。csv

REGO,STATUS,SHIFT,LOCATION,LOADED       
CCA2420,StatusOn,11:24,BRISBANE,1
CCA2744,StatusOn,4:00,SYDNEY,1
CCA2009,StatusOn,4:00,MELBOURNE,0
REGO,CORRECT_SHIFT
CCA2420,6:00
CCA2660,6:00
CCA2009,5:30
算法:

1。检查“列表到检查.csv”“已加载”列中的值

A.如果值等于“0”,则转至步骤2

B.如果值等于“1”,则跳过此行并转到下一行

2.检查“List\u to\u Check.csv”中的“REGO”值是否显示在“List\u to\u Compare.csv”中

A.如果为真,则转至步骤3

B.如果为false,则跳过此行并转到下一行

3.将“List\u”中的“SHIFT”值更改为“Change.csv”,值显示在“List\u to\u Compare.csv”中


4。将更改的每一行字符串化并导出到文本文件。

我的建议是将工作流程分为三个步骤:

  • 将所有行解析为javascript对象
  • 对对象数组执行逻辑
  • 将对象字符串化回CSV
  • //这将根据列的顺序创建对象:
    常量条目=([rego,status,shift,location,loaded])=>
    ({rego,status,shift,location,loaded});
    //我们对哪些作品感兴趣?
    const shouldHandleEntry=({loaded})=>loaded==“1”;
    //我们如何更新这些条目?
    const updateEntry=条目=>({
    进入
    班次:[“CCA4118”]包括(entry.rego)
    ? "5:33"
    :entry.shift
    });
    //我们出口什么?
    const exportEntry=({rego,shift})=>`${rego},${shift}`;
    //链接创建新表的步骤:
    console.log(
    csvBody(getCSV())
    .map(条目)
    .过滤器(应安装和安装)
    .map(更新尝试)
    .map(导出条目)
    .join(“\n”)
    )
    //(如果将其用于生产代码,则需要进行此操作)
    函数csvBody(csvString){
    返回csvString
    .split(“\n”)
    .map(line=>line.trim().split(“,”))
    .切片(1);
    };
    函数getCSV(){return`REGO,STATUS,SHIFT,LOCATION,LOADED
    CCA4110,StatusON,5:43,布里斯班,1
    澳大利亚,悉尼,5:44,CCA4112,StatusON
    
    CCA4118,StatusON,6:11,墨尔本,1`;}
    我的建议是将工作流程分为三个步骤:

  • 将所有行解析为javascript对象
  • 对对象数组执行逻辑
  • 将对象字符串化回CSV
  • //这将根据列的顺序创建对象:
    常量条目=([rego,status,shift,location,loaded])=>
    ({rego,status,shift,location,loaded});
    //我们对哪些作品感兴趣?
    const shouldHandleEntry=({loaded})=>loaded==“1”;
    //我们如何更新这些条目?
    const updateEntry=条目=>({
    进入
    班次:[“CCA4118”]包括(entry.rego)
    ? "5:33"
    :entry.shift
    });
    //我们出口什么?
    const exportEntry=({rego,shift})=>`${rego},${shift}`;
    //链接创建新表的步骤:
    console.log(
    csvBody(getCSV())
    .map(条目)
    .过滤器(应安装和安装)
    .map(更新尝试)
    .map(导出条目)
    .join(“\n”)
    )
    //(如果将其用于生产代码,则需要进行此操作)
    函数csvBody(csvString){
    返回csvString
    .split(“\n”)
    .map(line=>line.trim().split(“,”))
    .切片(1);
    };
    函数getCSV(){return`REGO,STATUS,SHIFT,LOCATION,LOADED
    CCA4110,StatusON,5:43,布里斯班,1
    澳大利亚,悉尼,5:44,CCA4112,StatusON
    
    CCA4118,StatusON,6:11,墨尔本,1`;}
    这可能会帮助您获得一些提示:。在任何情况下,这只是关于拆分字符串,您是否尝试过任何方法,或者您正在寻找一种理论方法?@briosheje非常感谢您提供的资源,我现在将检查它。我自己也做过一些尝试,根据回车符分割输入,并尝试(但失败)理解如何使用Papa Parse来处理文件。我想我更想知道是否有更聪明的方法来看待这个问题。再次感谢您,请分享您正在谈论的尝试(因此,代码),这将是一个很好的起点,很高兴帮助您从您的输入开始;)这可能会帮助您获得一些提示:。在任何情况下,这只是关于拆分字符串,您是否尝试过任何方法,或者您正在寻找一种理论方法?@briosheje非常感谢您提供的资源,我现在将检查它。我自己也做过一些尝试,根据回车符分割输入,并尝试(但失败)理解如何使用Papa Parse来处理文件。我想我更想知道是否有更聪明的方法来看待这个问题。再次感谢您,请分享您正在谈论的尝试(因此,代码),这将是一个很好的起点,很高兴帮助您从您的输入开始;)这是难以置信的,而且非常接近我想要表达的意思。非常感谢你抽出时间来做这件事。我从你写的文章中学到了很多。如果我想检查一个条件,例如“位置=1”,那么这很有意义。如果我想检查多个条件,那么最好的方法是什么?我用一个c语言的例子编辑了这篇主要文章