【发布时间】:2020-12-04 10:57:46
【问题描述】:
我正在尝试为我的网络项目制作一个翻译模块,但我碰壁了。我编写了两个函数,一个用于导入 CSV 数据,另一个用于更改、删除和添加新数据到 CSV 文件。
除了添加部分之外,一切都像魅力一样。它将数据添加到 CSV 文件中,但是当我想通过 PHP 将其导入网站时,它不会显示添加的值。 (它看到它们应该是值,但它返回空结果)我用于读取 csv 文件的函数是:
// Load in CSV (File name, delimiter, Fixed array[key,value] (optional))
function load__CSV($filename='', $delimiter=';', $fixed = null){
if(!file_exists($filename) || !is_readable($filename)) {
return FALSE;
}
$header = NULL;
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE) {
while (($row = fgetcsv($handle, 100000, $delimiter)) !== FALSE) {
if (!$header) {
$header = $row;
} else {
$data[] = array_combine($header, $row);
}
}
fclose($handle);
}
if($fixed != null) {
foreach($data as $entry){
$set_csv[$entry[''.$fixed[0].'']] = $entry[''.$fixed[1].''];
}
} else {
$set_csv = $data;
}
return $set_csv;
}
我用来添加、编辑或删除 CSV 内容的功能是:
// Change csv
function update__csv($csv = 'csv/language.csv',$key = array(2,''),$values = array([3,''],[4,'']),$status = 'change') {
$input = fopen(BASE_URL.$csv, 'r');
$output = fopen(BASE_URL.'csv/temporary.csv', 'w');
while (false !== ($data = fgetcsv($input, 10000, ";"))) {
if ($data[$key[0]] == $key[1]) {
foreach ($values as $value) {
$data[$value[0]] = $value[1];
}
if ($status == 'change' || $status == 'new') {
fputcsv($output, $data, ";");
}
} else {
fputcsv($output, $data, ";");
}
}
if($status == 'new'){
fputcsv($output, $values, ";");
}
fclose( $input );
fclose( $output );
unlink(BASE_URL . $csv);
rename(BASE_URL . 'csv/temporary.csv', BASE_URL . $csv);
}
如果我将新值添加到 CSV 文件,然后在我的 PC 上打开 CSV 并再次将其(不更改任何内容)安全地保存为 UTF-8 编码的 CSV,那么它会按预期工作并加载正确的数据。如果我在 Notepad++ 中打开 CSV,我会看到手动添加的项目和 php 添加的项目之间的差异:
我尝试了其他编码方法,但这对我来说有点新,所以我认为我做错了什么。提前感谢您帮助我!
【问题讨论】:
-
我不知道这里到底应该有什么问题,而且你的截图也没有帮助。您在部分数据下方画了一条弯曲的红线 - 这应该告诉我们现在是什么?
-
对不起你的权利。屏幕截图来自 Notepad++,其中添加了弯曲的红线下的代码(我认为当您手动保存 CSV 时)。但是,如果您在 PHP 中使用 'fputcsv' 将新的数据行放入 CSV 文件中,则它不会出现在弯曲线的部分。如果我手动添加该部分并保存文件,则数据读取应该是这样。给定的两个函数有效,但我唯一的问题是使用 PHP 加载 CSV 时使用“fputcsv”添加的数据不可见。
-
如果
fputcsv写入的列比预期的少,那么最合乎逻辑的结论是你填充了你传递给它的数据数组,开始时值太少......所以,调试一下? -
感谢您的提示,但我做了一些调试(我刚才也尝试了一些东西),它确实是额外的 coloms。但是当我最初制作 CSV 文件时,它们只有 5 个 coloms。仅当我使用“fputcsv”添加新值(因此不用于删除或编辑值)时,它才会添加 2 个额外的 coloms。我不明白它为什么这样做。我在代码中没有发现任何东西可以解释为什么它会添加这些额外的coloms。
-
fputcsv在一个输出行中创建尽可能多的列,因为您输入的数组包含元素。