У меня есть файл csv, который выглядит так:
$lines[0] = "text, with commas", "another text", 123, "text",5;
$lines[1] = "some without commas", "another text", 123, "text";
$lines[2] = "some text with commas or no",, 123, "text";
И хотелось бы иметь таблицу:
$t[0] = array("text, with commas", "another text", "123", "text","5");
$t[1] = array("some without commas", "another text", "123", "text");
$t[2] = array("some text, with comma,s or no", NULL , "123", "text");
Если я использую split($lines[0],","),я получу "text" ,"with commas" ... Есть ли какой-нибудь более элегантный способ сделать это?
Ответ 1
Вы можете использовать fgetcsv для разбора CSV-файла, не заботясь о том, чтобы разбирать его самостоятельно. Пример из руководства по PHP:
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
echo "<p> $num fields in line $row: <br /></p>\n";
$row++;
for ($c=0; $c < $num; $c++) {
echo $data[$c] . "<br />\n";
}
}
fclose($handle);
}
Ответ 2
Я также привожу простой метод получения прочитанного файла csv.
$sfp = fopen('/path/to/source.csv','r');
$dfp = fopen('/path/to/destination.csv','w');
while ($row = fgetcsv($sfp,10000,",","")) {
$goodstuff = "";
$goodstuff = str_replace("¦",",",$row[2]);
$goodstuff .= "\n";
fwrite($dfp,$goodstuff);
}
fclose($sfp);
fclose($dfp);
Ответ 3
Возможно, мой код решит вашу проблему:
// Разбираем все содержимое csv-файла и формируем массив из строк.
function csv_content_parser($content) {
foreach (explode("\n", $content) as $line) {
// Генератор сохраняет состояние и может быть возобновлен, когда потребуется следующее значение.
yield str_getcsv($line);
}
}
// Получение содержимого из файла csv.
$content = file_get_contents('your_file.csv');
// Создаем один массив из строк csv-файла.
$data = array();
foreach (csv_content_parser($content) as $fields) {
array_push($data, $fields);
}
В результате вы получите массив со всеми значениями из csv. Это будет что-то вроде этого:
Array (
[0] => Array (
[0] => text, with commas
[1] => another text
[2] => 123
[3] => text
[4] => 5
)
[1] => Array (
[0] => some without commas
[1] => another text
[2] => 123
[3] => text
)
[2] => Array (
[0] => some text, with comma,s or no
[1] => NULL
[2] => 123
[3] => text
)
)
Ответ 4
Предположим, вам нужно создать функцию для того же решения, тогда она должна выглядеть следующим образом:
function csvtoarray($filename='', $delimiter){
if(!file_exists($filename) || !is_readable($filename)) return FALSE;
$header = NULL;
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE ) {
while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
if(!$header){
$header = $row;
}else {
$data[] = array_combine($header, $row);
}
}
fclose($handle);
}
if(file_exists($filename)) @unlink($filename);
return $data;
}
$data = csvtoarray('file.csv', ',');
print_r($data);
Ответ 5
Вы можете использовать что-то вроде https://github.com/htmlburger/carbon-csv, которое позволяет отображать столбцы в целевом файле:
$csv = new \Carbon_CSV\CsvFile('path-to-file/filename.csv');
$csv->set_column_names([
0 => 'first_name',
1 => 'last_name',
2 => 'company_name',
3 => 'address',
]);
foreach ($csv as $row) {
print_r($row);
}
Результат нижеприведенного кода будет выглядеть следующим образом:
Array (
[0] => Array (
[first_name] => John
[last_name] => Doe
[company_name] => Simple Company Name
[address] => Street Name, 1234, City Name, Country Name
)
[1] => Array (
[first_name] => Jane
[last_name] => Doe
[company_name] => Nice Company Name
[address] => Street Name, 5678, City Name, Country Name
)
)
Ответ 6
Я создал приложение для извлечения данных из CSV файла, это php приложение было использовано для отображения ежедневных котировок для пользователей. Также это код класса для приложения, которое я создал:
<?php
/*
Главный класс
пожалуйста, обратите внимание
1- файл CSV должен быть разделен запятыми (,), и каждая строка должна заканчиваться символом (;).
2- не стесняйтесь редактировать файл all.CSV и добавлять все множество новых цитат.
3- не меняйте ничего, особенно расположение файла CSV.
*/
class Quote{
// свойства
private $_quote,$_allQuotes;
private static $_instance = null;
// конструктор
private function __construct(){
//Day Count
$dayCount = date(z);
if($this->readCsvAndGetQuote($dayCount)){
return $this->getQuote();
}else{
echo 'Ошибка при открытии файла .CSV';
}
}
// Методы
// получение экземпляра
public function getInstance(){
if(!isset(self::$_instance)){
self::$_instance = new Quote();
}
return self::$_instance;
}
public function getQuote() {
return $this->_quote;
}
//Чтение CSV
private function readCsvAndGetQuote($dayCount = 1 ) {
if(($handel = fopen("csv/all.csv" , "r")) !== false){
$this->_allQuotes = fgetcsv($handel,1000000,';');
$this->_quote = explode(',',$this->_allQuotes[$dayCount]);
return true;
}
return false;
}
}
Web