如何定位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
相关产品推荐
相关产品推荐

