【问题标题】:Using JavaScript to step through a CSV使用 JavaScript 单步执行 CSV
【发布时间】:2013-04-25 21:47:31
【问题描述】:

所以我有一个csv文件如下

Name1,url1
Name2,url2
Name3,url3

我想创建一个 javascript(如果需要,也可以使用 PHP)来遍历 csv 的每一行,并将名称与网站进行比较。页面左上角的图片只是一个显示“名称”的框,页面的右半部分加载 url,左下角有一个左右箭头,您可以单击该箭头在 CSV 中移动。

我正在考虑使用 iFrame 来分解页面。真正的挑战是加载 CSV。我正在考虑使用 php 执行此操作,并将所有数据放入 html 页面,但如果我的 CSV 很大,这可能是个问题。

我是否以正确的方式解决这个问题?

【问题讨论】:

  • 你在这里真正问的是什么,你能把它提炼一下吗?比如,“我如何加载一个 CSV 文件以便我可以使用 JavaScript 检查它?”。就目前而言,您的问题范围很广。
  • 我有一堆地名,以及与之相关的网址。我有超过 10,000 个我必须检查并目视检查每一个是否正确。所以我正在尝试创建一个 javascript 页面,这将使这更容易
  • 您能否展示一个示例(以文本形式,或使用 jsfiddle.net)您希望从“name,www.name.com”行中获得什么?
  • 使用框架永远不是正确的方法,在某些情况下它可能是唯一的方法,但它不是正确的方法。
  • 您的问题是询问如何实现不适合 SO 的东西。 SO 用于“这是我的代码,它应该执行 A,但是当我执行 X、Y、Z 时它正在执行 B”。

标签: php javascript html csv


【解决方案1】:

我以前做过一次这样的事情。进行了 AJAX 调用以获取 CSV(使用 jQuery):

var x = $.ajax('schedule.csv').done( function(){parse(x);});

然后像这样解析数据:

function parse (data)
{
    cells=[];
    rowBreaks = [];
    rowCounter=0;
    var cellCounter=0;
    var inQuotes = false;

    y=data.responseText;
    console.log(y.length);
    for(n=0; n<y.length; n++)
    {
        if(n == 0 & y[n] != ",")
            cells[cellCounter]=y[n];
        if(n != 0 && y[n] != ',')
        {
            cells[cellCounter]+=y[n];
        }
        if(y[n] == '"')
            inQuotes = !inQuotes;
        if(n>0 && !inQuotes && y[n] == ",")
        {
            if(cells[cellCounter] == undefined)
                cells[cellCounter] = " ";
            else
                cells[cellCounter]+=" ";
            cellCounter++;
        }
        if(n>0 && !inQuotes && (y[n] == "\n" || y[n] == "\r"))
        {
            rowBreaks[rowCounter] = cellCounter;
            rowCounter++;
        }
        if(cells[cellCounter] == undefined)
            cells[cellCounter] = "";
    }
    fixRows();
    writeTable();
    $("body").css("overflow-x", "auto");

}

您不应该需要所有这些,但它会非常方便地解析 CSV 文件。如果有帮助,writeTable() 函数如下所示:

function writeTable()
{
    table=$("<table border='1' cellpadding='1' />");
    var q;
    var rowBlank;
    var rowLength = rowBreaks[0]-8;
    for(z=0; z<rowBreaks.length; z++)    
    {
        tr = $("<tr />");
        if(z == 0)
            tr.addClass("header");
        rowBlank = true;
        for(i=0; i<rowLength; i++)
        {
            q=(z)*25+i;
            td=$("<td />").html(cells[q]);
            tr.append(td);
            if(cells[q] != " " && cells[q] != "" && cells[q] != "\n" && cells[q] != "\r")
                rowBlank = false;
        }
        /*if(!rowBlank)*/
        table.append(tr);
    }

    table.css({
        "border-spacing"    : 0,
        "width"             : "100%",
        "height"            : "99%"

    });

    $("#schedule").html("");
    $("#schedule").append(table);
    sizeTable();
}

这很丑,但对我有用。

注意,这都是真实的代码,所以你不需要我用来调试的console.log(),也不需要保留任何变量名。在我让公司切换到 Google Docs 之前,它用于解析保存为 excel 文件的 80 x 20 excel 表,因此它在 CSV 文件的大小方面非常强大。

【讨论】:

    【解决方案2】:

    在 PHP 中,您需要使用 fgetcsv()

    <?php
    if (($handle = fopen("test.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            list($name, $url) = $data;
            // do something with $name and $data
        }
        fclose($handle);
    }
    

    请记住以下几点:

    • 如果需要经常读取此文件,您将遇到 I/O 问题。
    • 如果需要经常写入此文件,您将更快地遇到 I/O 问题。
    • 尽量不要在内存中存储超过最小行数,否则您可能会遇到 PHP 的内存限制。
    • CSV 错误,数据库良好。

    【讨论】:

    • 因此,您认为我应该使用数据库来存储数据,而不是将原始数据存储在 CSV 中?如果是这样,那么我会将我的数据放在 MySQL 中(我的首选数据库,如果您不喜欢,欢迎反馈),然后使用 php/javascript 连接到该数据库并加载数据?
    • @djc391 在大多数情况下,最好将这样的大量数据存储在 SQL 数据库中。直接的好处是索引、查询缓存、与其他数据 [其他表] 更流畅的集成,以及能够将数据操作卸载到另一台服务器。
    猜你喜欢
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    相关资源
    最近更新 更多