Инкапсулируйте текст с кавычками в файле, разделенном запятыми

У меня есть CSV-файл, который выглядит так:

Amebiasis,California,2001,Total,571,34514777,1.654,1.521,1.796
Amebiasis,California,2001,Female,176,17340743,1.015,0.871,1.176
Amebiasis,California,2001,Male,365,17174034,2.125,1.913,2.355

Мне нужен скрипт, который инкапсулирует все текстовые блоки, что делает его похожим на:

"Amebiasis","California",2001,"Total",571,34514777,1.654,1.521,1.796
"Amebiasis","California",2001,"Female",176,17340743,1.015,0.871,1.176
"Amebiasis","California",2001,"Male",365,17174034,2.125,1.913,2.355

Я привык работать с PHP, но приветствуются решения на других языках.

Я пытался использовать собственные решения Excel, но это дает мне три кавычки:

    """Amebiasis""","""California""",2001,"""Total""",571,34514777,1.654,1.521,1.796

3

Решение

Вы можете использовать функцию кодирования CSV PHP, но вы должны добавить небольшую вспомогательную функцию. Причина в том, что нативная функция придерживается csv стандарт, который делает не требует, чтобы ячейки были заключены, если они не требуются для анализа их структурой содержимого.

Это пример:

<?php
function encodeFunc($value) { return "\"$value\""; }

$h_input = fopen('input.csv', 'r');
$h_output = fopen('output.csv', 'w');
while ($input = fgetcsv($h_input)) {
fputcsv($h_output, array_map('encodeFunc', $input), ',', chr(0));
}
readfile('output.csv');

файл input.csv держит:

Amebiasis,California,2001,Total,571,34514777,1.654,1.521,1.796
Amebiasis,California,2001,Female,176,17340743,1.015,0.871,1.176
Amebiasis,California,2001,Male,365,17174034,2.125,1.913,2.355

файл output.csv будет держать:

"Amebiasis","California","2001","Total","571","34514777","1.654","1.521","1.796""Amebiasis","California","2001","Female","176","17340743","1.015","0.871","1.176""Amebiasis","California","2001","Male","365","17174034","2.125","1.913","2.355"

Кстати: этот подход работает и для больших файлов, он масштабируется без проблем, так как он никогда не загружает полный файл в память, а только одну строку за раз 😉

2

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

Я бы сказал: не чини, если не сломалось. Ваш CSV идеален, как он есть.

Но, возможно, вам нужно, чтобы они были указаны для определенного программного обеспечения?

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

text1,"text2, some more",1.234,"44,25"

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

"""Amebiasis""","""California"""

Что бы вы ни делали, не используйте регулярные выражения дляфиксировать‘CSV, потому что это может нарушить будущие обновления ваших данных, если поля имеют разделитель или кавычки внутри них.

1

Вы можете использовать регулярные выражения и preg_replace изменить это.

$string = 'Amebiasis,California,2001,Total,571,34514777,1.654,1.521,1.796';
// '\b' is a word boundary
$pattern = '/\b/i';
$replacement = '"';
$newstring =  preg_replace($pattern, $replacement, $string);
//the string with quotes
echo $newstring;
0
По вопросам рекламы [email protected]