如何迭代javascript行分隔字符串,检查分号分隔的第一个值,并在值相等的位置连接行?

如何迭代javascript行分隔字符串,检查分号分隔的第一个值,并在值相等的位置连接行?,javascript,jquery,arrays,csv,delimiter,Javascript,Jquery,Arrays,Csv,Delimiter,我有一个CSV,我正在使用它作为数据源。我需要将换行符(“\n”)上的行拆分为一个名为“lines”的变量,并需要将每行中分号(“;”)分隔的值拆分为一个名为“items”的变量 我希望能够检查一行中的第一个值,如果它等于输入框中的输入值,我希望将这一行(值之间带有分号分隔符)添加到名为newData的新变量中。如果它不等于输入框中的值,我想排除它 我基本上想过滤掉第一个值不等于我要搜索的值的每一行 以下是数据示例(假设每行后面都有一个换行符('\n'): 我可以拆分第一行标题,但这不会包含在我

我有一个CSV,我正在使用它作为数据源。我需要将换行符(“\n”)上的行拆分为一个名为“lines”的变量,并需要将每行中分号(“;”)分隔的值拆分为一个名为“items”的变量

我希望能够检查一行中的第一个值,如果它等于输入框中的输入值,我希望将这一行(值之间带有分号分隔符)添加到名为newData的新变量中。如果它不等于输入框中的值,我想排除它

我基本上想过滤掉第一个值不等于我要搜索的值的每一行

以下是数据示例(假设每行后面都有一个换行符('\n'):

我可以拆分第一行标题,但这不会包含在我正在寻找的结果中。如果我的搜索在ID列上,搜索值为1,我只想返回ID等于1的行,并希望它与上面的格式匹配(sans标题行)。相反,如果搜索值为7,则只返回无行或仅返回标题行

到目前为止,我所能做的就是从导入的数据中分割出行(我发现的所有这些代码,我对javascript或jQuery都不太熟悉):

$.get(“myFile.csv”,函数(数据){
数据=数据。替换(/“/g,”);
变量行=data.split('\n');
var first=lines.shift().split(“;”);
});
//HTML输入框
搜寻

谢谢。

这里有一些这样做的代码,假设您知道如何使数据与lines变量中的数据相同(您说您做到了)。您可以按任何字段和任何值进行搜索

$(文档).ready(函数(){
变量标题=““ID”;“日期”;“时间”;“状态”;
变量行=[
“1”;“2013.01.01”;“上午10:03”;“活动”,
“1”;“2013.01.05”;“上午7:45”;“活动”,
“2”;“2013.01.03”;“晚上9:12”;“活动”,
“2”;“2013.01.11”;“上午6:37”;“非活动”,
“1”;“2013.01.22”;“下午12:57”;“非活动”
];
//其中包含要搜索的字段的名称
//由标题和要搜索的值定义。
var searchField='ID';
var searchForThisValue=1;//这将是代码中的一个参数
var endResult=[];//这是存储的结果
var-fieldIndex=-1;
$.each(headers.split(“;”),函数(index){
if(this.replace(/[“]/g,”)==searchField){
字段索引=索引;
}
});
$.each(行,函数(){
var fields=this.split(“;”);//用分号拆分
//去掉数字周围的引号
如果(字段[fieldIndex].replace(/[“]/g,”)==searchForThisValue){
endResult.push(这个);
} 
});
//对你的结果做任何你想做的,这里我刚刚抛出
//将它们放入id为“blah”的元素中
$.each(endResult,function(){
$('#blah')。追加(this+'
'); }); });
下面是一个使用纯JavaScript的简单解决方案:

// Assuming csvString is the string given in the question
var inputArray = csvString.split('\n');
var filteredArray = inputArray.filter(function (rowString) {
  return (rowString.split(";")[0] === '"1"');
});
var filteredString = filteredArray.join('\n');
在此结束时,
filteredString
将:

"1";"2013.01.01";"10:03 AM";"Active"
"1";"2013.01.05";"07:45 AM";"Active"
"1";"2013.01.22";"12:57 PM";"Inactive"
有关此解决方案中使用的方法如何工作的更多信息,请参阅:


    • 这似乎有点言过其实,但我认为解决这类问题最好的办法是首先将深奥的数据格式(CSV)转换成Javascript可以全面理解的格式(JSON类型的数据-数组和对象)。我无法使用AJAX(但您已经对这部分进行了排序),因此我创建了一个示例,从HTML中的一个元素提取CSV数据

      工作演示

      背景代码
      函数findEntriesWithID(ID){
      var分录=[];
      对于(变量i=0;i
      解释
    • csvToArray
      将CSV作为字符串,并输出一个对象数组,其中第一行(标题)为用于确定每个后续行的属性。这是代码的核心部分,可以应用于各种情况,以便于以可管理的形式获取数据。可能需要详细说明,但对于您的用例来说相当可靠。代码的其余部分则更容易理解:

    • findEntriesWithID
      获取给定的ID并返回具有该ID属性的所有对象(以前是行),然后将它们作为新数组返回

    • 顶部的jQuery函数绑定用户交互,然后在一个窗格中以字符串化JSON的形式输出结果。将CSV字符串转换为深奥的对象,只将其转换回具有不同语法的字符串,这可能看起来很愚蠢,但优点是您可以将函数的这一部分替换为其他任何内容这是你真正想和y做的
      $(document).ready(function() {
      
          var headers = '"ID";"Date";"Time";"Status"';
          var lines = [
          '"1";"2013.01.01";"10:03 AM";"Active"',
          '"1";"2013.01.05";"07:45 AM";"Active"',
          '"2";"2013.01.03";"9:12 PM";"Active"',
          '"2";"2013.01.11";"6:37 AM";"Inactive"',
          '"1";"2013.01.22";"12:57 PM";"Inactive"'
              ];
      
          // these contain the name of the field you want to search in
          //  as defined by your header and the value to search for.
          var searchField = 'ID';
          var searchForThisValue = 1; // this would be a parameter in your code
          var endResult =[]; // this is the stored result
          var fieldIndex = -1;
      
          $.each(headers.split(';'), function(index) {
              if( this.replace(/["']/g, "") == searchField ) {
                  fieldIndex = index;
              }
          });
      
          $.each(lines, function() {
              var fields = this.split(';'); // split up by semicolon
      
              // strip the quotes around around the numbers
              if(fields[fieldIndex].replace(/["']/g, "") == searchForThisValue) {
                  endResult.push(this);
              } 
          });
      
          // do whatever you want with your result, here I have just thrown 
          // them into an element with the id of 'blah'
          $.each(endResult, function() {
              $('#blah').append(this + '<br/>');
          });
      });
      
      // Assuming csvString is the string given in the question
      var inputArray = csvString.split('\n');
      var filteredArray = inputArray.filter(function (rowString) {
        return (rowString.split(";")[0] === '"1"');
      });
      var filteredString = filteredArray.join('\n');
      
      "1";"2013.01.01";"10:03 AM";"Active"
      "1";"2013.01.05";"07:45 AM";"Active"
      "1";"2013.01.22";"12:57 PM";"Inactive"
      
      function findEntriesWithID(ID){
        var entries = [];
      
        for(var i = 0; i < csvArray.length; ++i){
          var row = csvArray[i];
      
          if(row.ID === ID){
            entries.push(row);
          }
        }
      
        return entries;
      }
      
      function csvToArray(csvString){
        // The array we're going to build
        var csvArray   = [];
        // Break it into rows to start
        var csvRows    = csvString.split(/\n/);
        // Take off the first line to get the headers, then split that into an array
        var csvHeaders = csvRows.shift().split(';');
      
        // Loop through remaining rows
        for(var rowIndex = 0; rowIndex < csvRows.length; ++rowIndex){
          var rowArray  = csvRows[rowIndex].split(';');
      
          // Create a new row object to store our data.
          var rowObject = csvArray[rowIndex] = {};
      
          // Then iterate through the remaining properties and use the headers as keys
          for(var propIndex = 0; propIndex < rowArray.length; ++propIndex){
            // Grab the value from the row array we're looping through...
            var propValue =   rowArray[propIndex].replace(/^"|"$/g,'');
            // ...also grab the relevant header (the RegExp in both of these removes quotes)
            var propLabel = csvHeaders[propIndex].replace(/^"|"$/g,'');;
      
            rowObject[propLabel] = propValue;
          }
        }
      
        return csvArray;
      }