У меня есть 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
Вы можете использовать функцию кодирования 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"
Кстати: этот подход работает и для больших файлов, он масштабируется без проблем, так как он никогда не загружает полный файл в память, а только одну строку за раз 😉
Я бы сказал: не чини, если не сломалось. Ваш CSV идеален, как он есть.
Но, возможно, вам нужно, чтобы они были указаны для определенного программного обеспечения?
В общем случае: в csv кавычки используются не для обозначения того, что определенные поля являются текстовыми, а для экранирования (или новых строк) внутри полей, например:
text1,"text2, some more",1.234,"44,25"
Если вы получаете 3 кавычки в Excel, это означает, что поля уже были заключены в кавычки, экранированы другой кавычкой, а затем заключены в кавычки (как уже упоминалось в @norlesh).
"""Amebiasis""","""California"""
Что бы вы ни делали, не используйте регулярные выражения дляфиксировать‘CSV, потому что это может нарушить будущие обновления ваших данных, если поля имеют разделитель или кавычки внутри них.
Вы можете использовать регулярные выражения и 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;