使用 Javascript 从 .dat 文件创建数组

Create an array from a .dat file using Javascript

我需要使用 Javascript 将此 file.dat 转换为数组以进行练习。

    Team            P     W    L   D    F      A     Pts
 1. Arsenal         38    26   9   3    79  -  36    87
 2. Liverpool       38    24   8   6    67  -  30    80
 3. Manchester_U    38    24   5   9    87  -  45    77
 4. Newcastle       38    21   8   9    74  -  52    71
 5. Leeds           38    18  12   8    53  -  37    66
 6. Chelsea         38    17  13   8    66  -  38    64
 7. West_Ham        38    15   8  15    48  -  57    53
 8. Aston_Villa     38    12  14  12    46  -  47    50
 9. Tottenham       38    14   8  16    49  -  53    50
10. Blackburn       38    12  10  16    55  -  51    46
11. Southampton     38    12   9  17    46  -  54    45
12. Middlesbrough   38    12   9  17    35  -  47    45
13. Fulham          38    10  14  14    36  -  44    44
14. Charlton        38    10  14  14    38  -  49    44
15. Everton         38    11  10  17    45  -  57    43
16. Bolton          38     9  13  16    44  -  62    40
17. Sunderland      38    10  10  18    29  -  51    40
-------------------------------------------------------
18. Ipswich         38     9   9  20    41  -  64    36
19. Derby           38     8   6  24    33  -  63    30
20. Leicester       38     5  13  20    30  -  64    28

网上冲浪我找到了解析文件和创建数组的代码。我工作了,但现在 我遇到了一些问题:因为在最终数组中我有很多不需要的字符,如空格、团队名称前的数字和仅由 ---- 组成的行-

这是 Html 代码和我的 script.js

function fileToArray(str, delimiter = /[#\s,]+/g) {
  // slice from start of text to the first \n index
  // use split to create an array from string by delimiter
  const headers = str.slice(0, str.indexOf("\n")).split(delimiter);
  console.log(headers);
  const rows = str.slice(str.indexOf("\n") + 1).split(delimiter);
  console.log(rows);

  // Map the rows
  // split values from each row into an array
  // use headers.reduce to create an object
  // object properties derived from headers:values
  // the object passed as an element of the array

  const arr = rows.map(function(row) {
    const values = row.split(delimiter);
    const el = headers.reduce(function(object, header, index) {
      object[header] = values[index];
      return object;
    }, {});
    return el;
  });

  // return the array
  return arr;
  console.log(arr);
}


const data = fileToArray(text);
var Json = JSON.stringify(data);
console.log(Json);

使用元字符 /[#\s,]+/g 我能够消除一些空格,但现在我不知道如何改进代码。

编辑:结果必须是这样的JSON:

  {
    "0": {
        "Team":"Arsenal", 
        "P": 38,
        "W":26,
        "L":9,
        "D":3,
        "F":79,
        "A":36,
        "Pts": 87
    },
    "1": {
        "Team":"Liverpool", 
        "P": 38,
        "W":24,
        "L":8,
        "D":6,
        "F":67,
        "A":30,
        "Pts": 80
    }, 
       ... 
}

也许是这样的

我把线剪掉后就破坏了

如果您想保留数字并使用对象而不是数组

function fileToArray(text) {
  const lines = text.split(/\n/); // split on \n
  const header = lines[0].trim().split(/\s+/); // split on whitespace after trimming
  return [...lines.slice(1).map(line => {
    // ignore the number and the dash
    const [number, team, p, w, l, d, f, ignore2, a, pts] = line.trim().split(/\s+/);
    return {[number]: {team, p, w, l, d, f, a, pts}}
  })]
}

console.log(
  fileToArray(text) 
)
<script>
  const text = `         Team            P     W    L   D    F      A     Pts
     1. Arsenal         38    26   9   3    79  -  36    87
     2. Liverpool       38    24   8   6    67  -  30    80
     3. Manchester_U    38    24   5   9    87  -  45    77
     4. Newcastle       38    21   8   9    74  -  52    71
     5. Leeds           38    18  12   8    53  -  37    66
     6. Chelsea         38    17  13   8    66  -  38    64
     7. West_Ham        38    15   8  15    48  -  57    53
     8. Aston_Villa     38    12  14  12    46  -  47    50
     9. Tottenham       38    14   8  16    49  -  53    50
    10. Blackburn       38    12  10  16    55  -  51    46
    11. Southampton     38    12   9  17    46  -  54    45
    12. Middlesbrough   38    12   9  17    35  -  47    45
    13. Fulham          38    10  14  14    36  -  44    44
    14. Charlton        38    10  14  14    38  -  49    44
    15. Everton         38    11  10  17    45  -  57    43
    16. Bolton          38     9  13  16    44  -  62    40
    17. Sunderland      38    10  10  18    29  -  51    40
    -------------------------------------------------------
    18. Ipswich         38     9   9  20    41  -  64    36
    19. Derby           38     8   6  24    33  -  63    30
    20. Leicester       38     5  13  20    30  -  64    28`
</script>

这里是数组版本

function fileToArray(text) {
  const lines = text.split(/\n/); // split on \n
  const header = lines[0].trim().split(/\s+/); // split on whitespace after trimming
  return [header, ...lines.slice(1).map(line => {
    // ignore the number and the dash
    const [ignore1, team, p, w, l, d, f, ignore2, a, pts] = line.trim().split(/\s+/);
    return [team, p, w, l, d, f, a, pts];
  })]
}

console.log(
  fileToArray(text) 
) 
<script>
  const text = `         Team            P     W    L   D    F      A     Pts
     1. Arsenal         38    26   9   3    79  -  36    87
     2. Liverpool       38    24   8   6    67  -  30    80
     3. Manchester_U    38    24   5   9    87  -  45    77
     4. Newcastle       38    21   8   9    74  -  52    71
     5. Leeds           38    18  12   8    53  -  37    66
     6. Chelsea         38    17  13   8    66  -  38    64
     7. West_Ham        38    15   8  15    48  -  57    53
     8. Aston_Villa     38    12  14  12    46  -  47    50
     9. Tottenham       38    14   8  16    49  -  53    50
    10. Blackburn       38    12  10  16    55  -  51    46
    11. Southampton     38    12   9  17    46  -  54    45
    12. Middlesbrough   38    12   9  17    35  -  47    45
    13. Fulham          38    10  14  14    36  -  44    44
    14. Charlton        38    10  14  14    38  -  49    44
    15. Everton         38    11  10  17    45  -  57    43
    16. Bolton          38     9  13  16    44  -  62    40
    17. Sunderland      38    10  10  18    29  -  51    40
    -------------------------------------------------------
    18. Ipswich         38     9   9  20    41  -  64    36
    19. Derby           38     8   6  24    33  -  63    30
    20. Leicester       38     5  13  20    30  -  64    28`
</script>