【问题标题】:How to upload a csv file and then parse its content with Ajax?如何上传 csv 文件,然后用 Ajax 解析其内容?
【发布时间】:2018-04-05 15:02:45
【问题描述】:

我已经有一个用于上传 CSV 文件的 PHP 脚本:它是与 Twitter 帐户(又名品牌)相关联的推文集合。顺便说一句,谢谢 T.A.G.S :)

我还有一个脚本来解析这个 CSV 文件:我需要提取表情符号、主题标签、链接、转发、提及,以及我需要为每条推文计算的更多细节(这是我的研究项目:数字情感。我'已经存储了 280k 条推文,其中包含 170k 表情符号)。

然后将每条推文及其指标保存在数据库中(表 TWEETS)、表情符号(表 EMOJIS)以及帐户统计信息(表 BRANDS)。

我使用了一个与这个非常相似的类:CsvImporter > https://gist.github.com/Tazeg/b1db2c634651c574e0f8。我做了一个循环来逐个解析每一行。

$importer = new CsvImporter($uploadfile,true); 
        while($content = $importer->get(1)) {
            $pack = $content[0];
            $data = array();
            foreach($pack as $key=>$value) {
                $data[]= $value;
            }
            $id_str = $data[0];
            $from_user = $data[1];

...

在我的所有计算之后,我"INSERT INTO TWEETS VALUES(...)",与EMOJIS 相同。之后,我必须进行一些其他操作

  1. 更新每个 id_str 的范围,如果我保存的推文是对上一条推文的回复)
  2. 将统计信息保存到表 BRAND

所有这些操作都编写在一个文件 insert.php 中,并在我提交上传表单时触发。 但是,如果推文太多,一切都会失败。我的服务器无法处理这么长时间的操作。

所以我想知道我是否可以对流程的某些部分进行 ajaxify,尤其是循环

  1. 上传文件
  2. 解析 1 CSV 行并将其保存在 SQL 中,并在每次保存推文时显示“OK”消息
  3. 计算所有其他内容(覆盖面和品牌统计数据)

我对@9​​87654325@ 知之甚少,但我想这与 beforeSend、success、complete 和所有 Ajax 事件有关。还是我完全错了!?

有人可以帮我吗?

【问题讨论】:

    标签: php ajax loops csv


    【解决方案1】:

    据我所知,您可以大大减轻服务器上的负载,因为$pack 已经是一个值数组,无需执行key value 循环。

    您还可以更惯用地编写 CSV 行中的值映射。除非您知道 CSV 文件可能很大,否则您也应该多行处理

    $importer = new CsvImporter($uploadfile, true);
    // get as many lines as possible at once...
    while ($content = $importer->get()) {
        // this loop works whether you get 1 row or many...
        foreach ($content as $pack) {
            list($id_str, $from_user, ...) = $pack;
            // rest of your line processing and SQL inserts here....
        }
    }
    

    您也可以从这里继续,在单个 INSERT 语句中将多行插入到您的数据库中,大多数 SQL 数据库都支持该语句。

    【讨论】:

    • 感谢您的回答。加载时间确实减少了。但我仍然面临超时问题。我知道查询/循环优化有很多事情要做。我仍然想知道 ajax 是否可以在这里帮助我
    • AJAX(通常)在远程浏览器中执行,您无法在浏览器中执行任何操作来提高在数据库中存储数据的性能。您仍然必须在服务器上有一个脚本来解析上传的 CSV 文件。您可以在浏览器上解析 CSV 文件并发送整个 AJAX 调用序列以逐个插入每一行,但这会很慢。您也可以在完成数据处理之前响应脚本的调用,前提是您先验证它。
    【解决方案2】:
    $f = fopen($filepath, "r");
        while (($line = fgetcsv($f, 10000, ",")) !== false) {
        array_push($entries, $line);
    }
    fclose($f);
    

    试试这个,它可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      相关资源
      最近更新 更多