Работа с CSV-файлом в странном формате - PullRequest
0 голосов
/ 26 марта 2020

Я использую функцию «LOAD DATA» с phpmyadmin для обновления (или обновления) некоторых данных в моей базе данных при загрузке файла CSV. CSV-файл имеет 50 столбцов и 200 тыс. Строк. Это работает очень хорошо и очень быстро с этим форматом:

100;101;102;103;104;....
Alfred;Mueller;Exampplestreet 1;12121;Chicago;....
John;Wiliams;Exampplestreet 2;12345;Dallas;....
Mandy;Peterson;Exampplestreet 3;44554;LA;....
...

Теперь у меня есть возможность полностью автоматизировать этот процесс, получив файл данных csv от поставщика данных. Но поставщик данных доставил CSV-файл, подобный следующему:

100#Alfred;101#Mueller;102#Exampplestreet 1;103#12121;104#Chicago;....
100#John;101#Wiliams;102#Exampplestreet 2;103#12345;104#Dallas;....
100#Mandy;101#Peterson;102#Exampplestreet 3;103#44554;104#LA;....

Есть ли шанс обработать формат поставщика? Я никогда не работал с CSV-файлом, отформатированным так?

1 Ответ

1 голос
/ 26 марта 2020

Выглядит так, как будто вам нужно будет извлекать тип поля из каждого значения, но я не уверен, что это уместно, но я преобразовал это в ключ для поля на случай, если вам это нужно (разница не велика) в любом случае).

По сути, каждая строка читается как строка CSV (ограниченная ;), затем для каждого поля explode() она равна # и, если есть 2 поля, добавьте ее в выходной массив ($data) ...

$fileName = "data.csv";
$handle = fopen ( $fileName, "r" );

while ( !feof($handle) )    {
    $fileData = fgetcsv( $handle, null, ";" );
    $data = [];
    foreach ( $fileData as $value ) {
        $values = explode("#", $value, 2);
        if ( count($values) == 2 )  {
            $data[ $values[0] ] = $values[1];
        }
    }

    print_r($data);
}
fclose($handle);

Вывод будет выглядеть примерно так ...

Array
(
    [100] => Alfred
    [101] => Mueller
    [102] => Exampplestreet 1
    [103] => 12121
    [104] => Chicago
)

Если вам не нужен тип поля и всегда следуют три символа на # вы можете сделать это короче, обновив значение массива чтения, используя substr(), чтобы всегда удалять первые 4 символа ..

while ( !feof($handle) )    {
    $data = fgetcsv( $handle, null, ";" );
    foreach ( $data as &$value ) {
        $value = substr($value, 4);
    }

    print_r($data);
}

Это, очевидно, будет медленнее, чем его загрузка напрямую (и вам нужно добавить вызовы базы данных к вышеприведенному).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...