Установить разделитель CsvEncoder в Symfony - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу декодировать CSV-файлы, но некоторые из них имеют ";"в качестве разделителей, которые приводят к дефектным объектам.С помощью следующего кода CSV-файлы, разделенные запятыми, правильно декодируются:

https://symfony.com/blog/new-in-symfony-3-2-csv-and-yaml-encoders-for-serializer

// instantiation, when using it as a component
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\CsvEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;

$serializer = new Serializer([new ObjectNormalizer()], [new CsvEncoder()]);

// instantiation, when using it inside the Symfony framework
$serializer = $container->get('serializer');

// encoding contents in CSV format
$serializer->encode($data, 'csv');

// decoding CSV contents
$data = $serializer->decode(file_get_contents('data.csv'), 'csv');

Я попытался установить контекст в качестве параметра в функции декодирования:

$context = array(";", '"', "\\", ",");

$data = $serializer->decode(file_get_contents($file), 'csv', $context);

и в качестве параметра в конструкторе:

$serializer = new Serializer([new ObjectNormalizer()], [new CsvEncoder($context)]);

Обе попытки без какого-либо другого результата.

Я получил это так:

$context = [
    CsvEncoder::DELIMITER_KEY => ';',
    CsvEncoder::ENCLOSURE_KEY => '"',
    CsvEncoder::ESCAPE_CHAR_KEY => '\\',
    CsvEncoder::KEY_SEPARATOR_KEY => ',',
];

$serializer = new Serializer([new ObjectNormalizer()], [new CsvEncoder()]);
$serializer = $this->get('serializer');
$data = $serializer->decode(file_get_contents($file), 'csv', $context);

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Для Symfony 4 хороший синтаксис:

$serializer = new Serializer([new ObjectNormalizer()], [new CsvEncoder()]);
$datas = $serializer->decode(file_get_contents($csvPath), 'csv', array(CsvEncoder::DELIMITER_KEY => ';'));
0 голосов
/ 07 февраля 2019

Попробуйте это:

$context = ['csv_delimiter' => [",", '"', "\\", "."] ];
...