You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定位CSV文件中的特定行?现有代码无法匹配非表头区域数据

解决方案:抓取CSV中特殊位置的数据

问题背景

每天获取结构固定的CSV文件,每周抽取部分数据存入数据库,当前通过条件搜索获取数据,但目标数据位于与表头不对应的行和列,现有逻辑无法抓取。

现有代码

$file = fopen($fname, "r");
while(! feof($file)) {
    $data = fgetcsv($file);
    if (strtotime($data[0]) == true && (!empty($data[12]))) {
        $sql = "UPDATE numbers
                    SET tot='" . $data[13] . "'
                WHERE date = '" . $lastDay . "'";
           if ($conn->query($sql) === TRUE) {
            echo "<li><p>" . $conn -> affected_rows . " newly created record in <u>tot</u>.</p></li>";
        }
    }
}

解决思路与修改代码

既然CSV结构固定,直接通过固定行号+列索引定位目标数据即可,无需依赖表头对应关系。以下是修改后的代码:

$file = fopen($fname, "r");
$rowNum = 0; // 初始化行号计数器
while(! feof($file)) {
    $data = fgetcsv($file);
    $rowNum++;
    
    // 保留原有逻辑
    if (strtotime($data[0]) == true && (!empty($data[12]))) {
        $sql = "UPDATE numbers
                    SET tot='" . $data[13] . "'
                WHERE date = '" . $lastDay . "'";
        if ($conn->query($sql) === TRUE) {
            echo "<li><p>" . $conn -> affected_rows . " newly created record in <u>tot</u>.</p></li>";
        }
    }

    // 新增:抓取特殊位置的数据(示例:目标在第8行第5列,数组索引从0开始对应$data[4])
    if ($rowNum == 8 && isset($data[4]) && !empty($data[4])) {
        $specialData = $data[4];
        // 替换为你的数据库操作逻辑
        $sql = "UPDATE numbers SET special_field='" . $specialData . "' WHERE date = '" . $lastDay . "'";
        if ($conn->query($sql) === TRUE) {
            echo "<li><p>" . $conn -> affected_rows . " record updated with special data.</p></li>";
        }
    }
}
fclose($file); // 记得关闭文件,避免资源泄漏

关键优化点

  • 行号定位:通过$rowNum计数器精准匹配目标行,结构固定的CSV行号不会变动,直接硬编码即可。
  • 安全提示:原代码直接拼接SQL存在注入风险,建议改用预处理语句:
// 预处理示例
$stmt = $conn->prepare("UPDATE numbers SET special_field=? WHERE date=?");
$stmt->bind_param("ss", $specialData, $lastDay);
$stmt->execute();
echo "<li><p>" . $stmt->affected_rows . " record updated with special data.</p></li>";
$stmt->close();
  • 边界判断:用isset($data[4])避免列索引超出数组范围导致报错。

内容的提问来源于stack exchange,提问作者drodsher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:13:17