JavaScript 解析 CSV Excel 文件

javascript to parse csv excel file

本文关键字:文件 Excel CSV 解析 JavaScript      更新时间:2023-09-26

我正在尝试解析我在Excel中创建的CSV文件。我想用它来更新我的谷歌地图。这个谷歌地图在我正在使用Eclipse for Android开发的移动应用程序中。

老实说,我不确定如何编写JavaScript。任何帮助将不胜感激。我很乐意归功于你的工作。

我只想在用户点击执行以下操作的按钮时运行一些 JavaScript:

  1. 定位用户当前位置(我已经完成了这部分!
  2. 查找在 中输入的附近位置。CSV Excel 文件,通过解析 ..CSV
  3. 在每个位置通知气泡内显示一个小链接,上面写着"导航",当用户单击它时,会打开 Google 地图应用程序并开始将用户从用户当前位置(地理位置)导航到该位置。

这是我完成此应用程序所需的唯一部分。因此,再一次,任何帮助都将不胜感激。谢谢大家!

老实说,我一直在解决这个问题。CSV格式不是为了便于解析,即使使用复杂的正则表达式也很难解析。

老实说,最好的办法是将其导入 FormSite 或 PHPMyAdmin,然后使用比","更容易解析的自定义分隔符重新导出文档。 我经常使用"%%"作为字段分隔符,一切都像一个魅力。

不知道这是否有帮助,但看看 http://www.randomactsofsentience.com/2012/04/csv-handling-in-javascript.html 是否有帮助......

附加:除了上面链接的解决方案(我的偏好)之外,我还使用了大量堆叠的正则表达式来标记 CSV,但针对自定义错误状态进行修改并不容易......

看起来很重,但仍然只需要几毫秒:

function csvSplit(csv){
  csv = csv.replace(/'r'n/g,''n')
  var rows = csv.split("'n");
  for (var i=0; i<rows.length; i++){
    var row = rows[i];
    rows[i] = new Array();
    row = row.replace(/&/g, "&amp;");
    row = row.replace(/''''/g, "&#92;");
    row = row.replace(/''"/g, "&quot;");
    row = row.replace(/'''/g, "&#39;");
    row = row.replace(/'',/g, "&#44;");
    row = row.replace(/@/g, "&#64;");
    row = row.replace(/'?/g, "&#63;");
    row = row.replace(/"([^"]*)"/g, "@$1'?");
    while (row.match(/@([^'?]*),([^'?]*)'?/)){
      row = row.replace(/@([^'?]*),([^'?]*)'?/g, "@$1&#44;$2?");
    }
    row = row.replace(/['?@]/g, "");
    row = row.replace(/''([^'']*)''/g, "@$1'?");
    while (row.match(/@([^'?]*),([^'?]*)'?/)){
      row = row.replace(/@([^'?]*),([^'?]*)'?/g, "@$1&#44;$2?");
    }
    row = row.replace(/['?@]/g, "");
    row = row.split(",")
    for (var j=0; j<row.length; j++){
      col = row[j];
      col = col.replace(/&#63;/g, "'?");
      col = col.replace(/&#64;/g, "@");
      col = col.replace(/&#44;/g, ",");
      col = col.replace(/&#39;/g, '''');
      col = col.replace(/&quot;/g, ''"');
      col = col.replace(/&#92;/g, '''');
      col = col.replace(/&amp;/g, "&");
      row[j]=col;
    }
    rows[i] = row;
  }
  return rows;
}

我遇到了这个问题,这就是为什么我必须提出这个答案,我在npm上发现了一个名为masala解析器的东西,它确实是一个解析器组合器。但是它还没有在浏览器上运行,这就是我使用此分支的原因,代码保持不变。请阅读它的文档以了解代码的解析器端。

import ('https://cdn.statically.io/gh/kreijstal-contributions/masala-parser/Kreijstal-patch-1/src/lib/index.js').then(({
  C,
  N,
  F,
  Streams
}) => {

  var CSV = (delimeter, eol) => {
 //parses anything beween a string converts "" into "
    var innerstring = F.try(C.string('""').returns("'"")).or(C.notChar("'"")).rep().map(a => a.value.join(''));
    //allow a string or any token except line delimeter or tabulator delimeter
    var attempth = F.try(C.char('"').drop().then(innerstring).then(C.char('"').drop())).or(C.charNotIn(eol[0] + delimeter))
    //this is merely just a CSV header entry or the last value of a CSV line (newlines not allowed)
    var wordh = attempth.optrep().map(a => (a.value.join('')));
    //This parses the whole header
    var header = wordh.then(C.char(delimeter).drop().then(wordh).optrep()).map(x => {
      x.header = x.value;
      return x
    })
    //allow a string or any token except a tabulator delimeter, the reason why we allow newlines is because we already know how many columns there is, so if there is a newline, it is part of the value.
    var attempt = F.try(C.char('"').drop().then(innerstring.opt().map(a=>(a.value.__MASALA_EMPTY__?{value:""}:a))).then(C.char('"').drop())).or(C.notChar(delimeter))
    //this is merely just a CSV entry
    var word = attempt.optrep().map(a => (a.value[0]?.value??a.value[0]));
    //This parses a CSV "line" it will skip newlines if they're enclosed with doublequotation marks
    var line = i => C.string(eol).drop().then(word.then(C.char(delimeter).drop().then(word).occurrence(i - 1).then(C.char(delimeter).drop().then(wordh)))).map(a => a.value);
    return header.flatMap(a => line(a.header.length - 1).rep().map(b => {
      b.header = a.header;
      return b
    }))
  };
  var m = {
    'tab': ''t',
    "comma": ",",
    "space": " ",
    "semicolon": ";"
  }
  document.getElementById('button').addEventListener('click', function() {
    var val = document.getElementById('csv').value;
    var parsedCSV = CSV(m[document.getElementById('delimeter').value], ''n').parse(Streams.ofString(val)).value;
    console.log(parsedCSV);
  })
})
Type some csv<br>
<textarea id="csv"></textarea>
<label for="delimeter">Choose a delimeter:</label>
<select name="delimeter" id="delimeter">
  <option value="comma">,</option>
  <option value="tab">'t</option>
  <option value="space"> </option>
  <option value="semicolon">;</option>
</select>
<button id="button">parse</button>

我建议剥离换行符和文件的结尾。因为它可能会感到困惑。

这似乎有效。您可能想翻译日语,但使用起来非常简单:http://code.google.com/p/csvdatajs/