Замените символ в CSV-строке, который похож на разделитель, но не на разделитель

У меня есть небольшая проблема с работой над строками в PHP.

Представьте себе файл CSV с этими полями:

ItemID;ItemText;ItemVAT;ItemEAN;

Понятно, что разделителем в этой строке является «;». Проблема в том, что значения из «ItemText» может быть тоже содержать «;»

Мне нужно отфильтровать эти строки и заменить содержащие «;» с чем-то другим, таким как «#» или «$», не имеет значения. Я пытался считать «;» с substr_count чтобы определить, если я иметь Вдобавок «;» (по сравнению с количеством строк «нормального» значения). Но я не знаю, как найти фактическое «;» в стоимости. Чтобы сделать вещи сложнее, может быть более одного «;» в строке значения.

У кого-нибудь есть идеи, как отфильтровать эти ненужные «;»?

2

Решение

Вы можете сделать что-то подобное, если у вас есть эти поля всегда.

$line = "34;erwffw;wefweef;fwe3242;23342;53453;";
$toArray = explode(";", $line);
$counntSemi = count($toArray);

$newLine[0] = $toArray[0]; // ItemID
$newLine[1] = ''; // ItemText
$newLine[2] = $toArray[$counntSemi-3]; // ItemVAT
$newLine[3] = $toArray[$counntSemi-2]; // ItemEAN

// ItemText filter
for($i=1; $i < ($counntSemi-3); $i++) {
$newLine[1] .= $toArray[$i]."@";
}

print_r($newLine);
// here you can implode this newLine with the semicolons
0

Другие решения

Когда поле содержит разделитель, оно должно быть заключено в кавычки, например:

valueA;"valueB;with;embedded;separators";valueC

Если это так, вы можете, например, объединить каждый элемент массива со следующим, пока он содержит нечетное число символов «».

Если создатель файла (кодировщик данных) не следовал этому правилу, то нет никакого общего способа правильно декодировать файл, потому что кодирование значений «A» и «B; C» приведет к тому же файлу CSV, что и кодирование значения «A; B» и «C». В этом случае вы можете винить только создателя или пытаться идентифицировать ItemVAT на основе имеющегося у вас паттерна.

0

По вопросам рекламы [email protected]