我保存了.csv
个文件" 键" (第一行)到array $CSV
以获取文件的多维数组
包含多个单词的键将其第一个和最后一个空格保留为第一个和最后一个字符。该文件以Windows-1252
编码,我将其转换为UTF-8
。
$keys = mb_convert_encoding($keys, 'UTF-8', 'Windows-1252');
$keys = trim(str_replace('"', ' ', $keys));
$keys = explode(';', $keys);
这里是第一个2键,第二个键保留其空格。
初始流程(key => value):
[Commande] => C......
[ Date de création ] => 01/01/1970
使用 urlencode(substr($keys[$j], 0, 1))
作为值:
[Commande] => C
[ Date de création ] => +
使用 rawurlencode(substr($keys[$j], 0, 1))
作为值:
[Commande] => C
[ Date de création ] => %20
使用我在preg_replace('/\xc2\xa0/', '', $keys)
等其他SO问题上找到的功能始终输出%20
。
我可以跳过此问题或以不同的方式工作,但我不明白为什么不能trim()
这些字符串。
$file = file(__DIR__ . '/path/to/' . $csv_file);
// Keys
$keys = mb_convert_encoding($file[0], 'UTF-8', 'Windows-1252');
$keys = trim(str_replace('"', ' ', $keys));
$keys = explode(';', $keys);
$CSV = [];
for ($i = 1; $i < count($file); $i += 1) {
$values = explode(';', $file[$i]);
for ($j = 0; $j < count($values); $j += 1) {
$values[$j] = mb_convert_encoding($values[$j], 'UTF-8', 'Windows-1252');
$values[$j] = trim(str_replace('"', ' ', $values[$j]));
$values = array_combine($keys, $values);
$CSV[] = $values;
}
}
die('<pre>' . print_r($CSV, true) . '</pre>');
答案 0 :(得分:2)
$keys = trim(str_replace('"', ' ', $keys)); $keys = explode(';', $keys);
大概你是从这一行开始的:
Commande;"Date de création";"Something something"
然后你将它变成这一行(你在这里引入空格):
Commande; Date de création ; Something something
然后修剪(删除行开头和结尾处的空格):
Commande; Date de création ; Something something
然后你正在爆炸线:
array('Commande', ' Date de création ', ' Something something')
trim
您应该使用CSV解析函数来解析CSV,而不是重新发明轮子:
explode
您应该使用fgetcsv
解析整个CSV文件,以提高效率:
$keys = array_map('trim', $keys);
这应该完全不需要$keys = str_getcsv($file[0], ';');
。