如何将数组转换为集合

时间:2016-07-15 09:08:20

标签: javascript arrays node.js mongodb collections

我有一个类似于此文件的.txt文件。

ID;SubID;No.;Name;Min;Max;Default;Factor;Unit 
101;5;0;Gas flow time;0;100;0.1;10;s 
101;30;1;Start speed;20;200;120;1;m/s 
;;2;Start current;0;999;1.0;10;A

我使用 npm package' fs' 使用 readFile 导入此.txt文件,然后使用CSVToArray将其转换为数组。在这里,您可以找到我用于转换的代码。

function CSVToArray( strData, strDelimiter ){
// Check to see if the delimiter is defined. If not, then default to comma.
strDelimiter = (strDelimiter || ";");

// Create a regular expression to parse the CSV values.
var objPattern = new RegExp(
    (
        // Delimiters.
        "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +

            // Quoted fields.
        "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +

            // Standard fields.
        "([^\"\\" + strDelimiter + "\\r\\n]*))"
    ),
    "gi"
);


// Create an array to hold our data. Give the array a default empty first row.
var arrData = [[]];
// Create an array to hold our individual pattern
// matching groups.
var arrMatches = null;

// Keep looping over the regular expression matches until we can no longer find a match.
while (arrMatches = objPattern.exec( strData )){

    // Get the delimiter that was found.
    var strMatchedDelimiter = arrMatches[ 1 ];

    // Check to see if the given delimiter has a length (is not the start of string) and if it matches
    // field delimiter. If id does not, then we know that this delimiter is a row delimiter.
    if (
        strMatchedDelimiter.length &&
        strMatchedDelimiter !== strDelimiter
    ){
        // Since we have reached a new row of data, add an empty row to our data array.
        arrData.push( [] );
    }
    var strMatchedValue;
    // Now that we have our delimiter out of the way, let's check to see which kind of value we
    // captured (quoted or unquoted).
    if (arrMatches[ 2 ]){
        // We found a quoted value. When we capture this value, unescape any double quotes.
        strMatchedValue = arrMatches[ 2 ].replace(
            new RegExp( "\"\"", "g" ),
            "\""
        );
    } else {
        // We found a non-quoted value.
        strMatchedValue = arrMatches[ 3 ];
    }
    // Now that we have our value string, let's add it to the data array.
    arrData[ arrData.length - 1 ].push( strMatchedValue );
}
// Return the parsed data.
return( arrData );

现在我想从CSVToArray返回的数组中创建一个名为 Parameter 的Collection。收藏品应如下所示:

// First entry: 
Parameter = {
    ID: 101;
    SubID: 5;
    No: 0;
    //...
}

// Second entry: 
Parameter = {
    ID: 101;
    SubID: 30;
    No:1;
    //...
}
...

有谁知道将数组转换为Collection的智能方法?

非常感谢大家!

3 个答案:

答案 0 :(得分:1)

我建议您保持现有的 CSVToArray 不变,并添加另一个进行最终转换的功能:

function tableToObjectArray(arrData) {
    var keys = arrData[0];
    return arrData.slice(1).map(function (row) {
        return row.reduce(function (obj, val, idx) {
            obj[keys[idx]] = val;
            return obj;
        }, {});
    });
}

您可以使用 CSVToArray 的输出调用它:

var arrData = CSVToArray(input, ';');
var objData = tableToObjectArray(arrData);

这是一个工作片段:



// Original left unchanged:
function CSVToArray( strData, strDelimiter ){
  // Check to see if the delimiter is defined. If not, then default to comma.
  strDelimiter = (strDelimiter || ";");

  // Create a regular expression to parse the CSV values.
  var objPattern = new RegExp(
    (
        // Delimiters.
        "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
            // Quoted fields.
        "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
            // Standard fields.
        "([^\"\\" + strDelimiter + "\\r\\n]*))"
    ),
    "gi"
  );

  // Create an array to hold our data. Give the array a default empty first row.
  var arrData = [[]];
  // Create an array to hold our individual pattern
  // matching groups.
  var arrMatches = null;

  // Keep looping over the regular expression matches until we can no longer find a match.
  while (arrMatches = objPattern.exec( strData )){

    // Get the delimiter that was found.
    var strMatchedDelimiter = arrMatches[ 1 ];

    // Check to see if the given delimiter has a length (is not the start of string) and if it matches
    // field delimiter. If id does not, then we know that this delimiter is a row delimiter.
    if (
        strMatchedDelimiter.length &&
        strMatchedDelimiter !== strDelimiter
    ){
        // Since we have reached a new row of data, add an empty row to our data array.
        arrData.push( [] );
    }
    var strMatchedValue;
    // Now that we have our delimiter out of the way, let's check to see which kind of value we
    // captured (quoted or unquoted).
    if (arrMatches[ 2 ]){
        // We found a quoted value. When we capture this value, unescape any double quotes.
        strMatchedValue = arrMatches[ 2 ].replace(
            new RegExp( "\"\"", "g" ),
            "\""
        );
    } else {
        // We found a non-quoted value.
        strMatchedValue = arrMatches[ 3 ];
    }
    // Now that we have our value string, let's add it to the data array.
    arrData[ arrData.length - 1 ].push( strMatchedValue );
  }
  // Return the parsed data.
  return( arrData );
}

// New function added:
function tableToObjectArray(arrData) {
    var keys = arrData[0];
    return arrData.slice(1).map(function (row) {
        return row.reduce(function (obj, val, idx) {
            obj[keys[idx]] = val;
            return obj;
        }, {});
    });
}

// Sample data:
var input = `ID;SubID;No.;Name;Min;Max;Default;Factor;Unit 
101;5;0;Gas flow time;0;100;0.1;10;s 
101;30;1;Start speed;20;200;120;1;m/s 
;;2;Start current;0;999;1.0;10;A`;

// Convert to 2D array
var arrData = CSVToArray(input, ';');
// Convert to object array
var objData = tableToObjectArray(arrData);
// Output result:
console.log(objData);




答案 1 :(得分:0)

你可以这样做很容易

///ID;SubID;No.;Name;Min;Max;Default;Factor;Unit 
///101;5;0;Gas flow time;0;100;0.1;10;s 
///101;30;1;Start speed;20;200;120;1;m/s 
///;;2;Start current;0;999;1.0;10;A

function convertCVS(strData, delemeter) {
  delemeter = delemeter || ";"
  var lines = strData.split("\n")
  var keys = lines.shift().split(delemeter)

  return lines.map(function(line){
    var object = {};
    var values = line.split(delemeter);
    for (var i = 0; i < keys.length; i++) {
      object[key[i]] = values [i];
    }
    return object;
  });
}

快乐编码^^

答案 2 :(得分:0)

正如@Danial所建议的,我们可以使用convertCVS函数进行一些修改,作为函数名convertCSVtoCollection:

function convertCSVtoCollection(strData, delimiter) {
            var result=[];  
            delimiter = delimiter || ";"
            var lines = strData.split("\n")
            var keys = lines.shift().split(delimiter)
            lines.map(function(line){
            var object = {};
            var values = line.split(delimiter);
                for (var i = 0; i < keys.length; i++) {
                        object[keys[i]] = values [i];
                    }
            result.push({"parameter":object});
         });
            return result;
      }

它会给你想要的结果。希望它对你有用..