2016-07-15 140 views
0

我有一个.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包 'FS'此.txt文件与READFILE和我将其转换为使用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返回数组的。收集应该是这样的:

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

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

有谁知道一个聪明的方式做转换阵列集合?

非常感谢!

回答

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

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

编码愉快^^

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

它会给你desi红色的结果。希望它能为你工作..