3

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

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

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

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

"ID";"Date";"Time";"Status"
"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"

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

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

$.get("myFile.csv", function(data) {
    data = data.replace(/"/g, "");

    var lines = data.split('\n');

    var first = lines.shift().split(';');
});

// HTML Input Box
<input id="search_box" type="text">
<button id="btn_search">Search</button>

谢谢。

4

3 回答 3

6

这是一个使用纯 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"

有关此解决方案中使用的方法如何工作的更多信息,请参阅:

于 2013-02-21T19:11:04.660 回答
2

这可能看起来有点夸大其词,但我认为解决此类问题的最佳方法是首先将您的深奥数据格式 (CSV) 转换为 Javascript 可以整体理解的内容(JSON 类型的数据 - 数组和对象)。我无法使用 AJAX(但你已经对那部分进行了排序),所以我举了一个例子,我从 HTML 中的元素中提取 CSV 数据。

工作演示

jsFiddle 示例

后台代码

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;
}

解释

  1. csvToArray将 CSV 作为字符串并输出一个对象数组,其中第一行(标题)用于确定每个后续行的属性。这是代码的核心,可以在各种情况下应用,以便以可管理的形式获取数据。可能会详细说明,但对于您的用例来说相当可靠。剩下的代码就更容易理解了:

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

  3. 顶部的 jQuery 函数绑定用户交互,然后在窗格中将结果作为字符串化 JSON 输出。使用这些长度将 CSV 字符串转换为深奥的对象只是为了将其转换回具有不同语法的字符串似乎很愚蠢,但优点是您可以将函数的这一部分交换为您真正想要的任何内容做你的结果。

于 2013-02-21T19:38:10.137 回答
-1

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

这段代码的jsFiddle

$(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/>');
    });
});
于 2013-02-21T19:03:05.713 回答