Web

Как извлечь данные из файла csv в PHP

У меня есть файл 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

Что такое буферизация вывода в PHP?

Что такое ДНС-сервер: расшифровываем термин простыми словами
Web

Что такое ДНС-сервер: расшифровываем термин простыми словами

Web

Как отсортировать многомерный массив по некоторому значению?

Web

Как запустить php-скрипт как процесс-демон

×