Być może banalne. Jest na to jakiś sposób, czy trzeba „rozkminiać” ręcznie?
Plik test.csv:
Poczytaj o plikach o formacie "csv", podaję pierwsze źródło z brzegu:
https://en.wikipedia.org/wiki/Comma-separated_values
Pisze tam coś takiego:
Each of the embedded double-quote characters must be represented by a pair of double-quote characters.
1997,Ford,E350,"Super, ""luxurious"" truck"
Żebyś mógł sobie używać cudzysłów w środku wyrazu, to musi on być poprzedzony jeszcze jednym cudzysłowem.
Przykład:
value;"myvalue ""value"""
Jeśli to, by Cię nie satysfakcjonowało, to możesz użyć mojej funkcji jako parsera formatu .csv.
File cache_or_not.csv:
"example";"example;example";exam
;"example";"example;example";exam
"example";"example;example";exam;
;"example";"example;example";exam;
;;"example";"example;example";exam;
;"example";"example;example";exam;;
;;;"example";some;something;meadow;;;;
File oak1.php:
<?php
function remove_first_and_last_characters($arr,$what_letter,$what_letter2,$flag,$one_or_more){
if($flag == false || strlen($what_letter)>1){
return $arr;
}else{
for($i=0;$i<count($arr);$i++){
$uuu = 0;
$last_place = strrpos($arr[$i],$what_letter);
$first_place = strpos($arr[$i],$what_letter);
$last_pos_in_array = strlen($arr[$i])-1;
$first_pos_in_array = 0;
$arrayek = [$last_place,$first_place];
$arrayek2 = [$last_pos_in_array,$first_pos_in_array];
for($zero_one=0;$zero_one<=1;$zero_one++){
if($arrayek[$zero_one]===$arrayek2[$zero_one]){
$uuu++;
if($one_or_more==false){
if($arr[$i][0]=='"' && strlen($arr[$i])==1){
$uuu = 1;
}
if($uuu==1){
null;
}else{
for($only=0;$only<=1;$only++){
$arr[$i] = substr_replace($arr[$i],$what_letter2,$arrayek[$only],1);
}
}
}else{
$arr[$i] = substr_replace($arr[$i],$what_letter2,$arrayek[$zero_one],1);
}
}
}
}
return ($arr);
}
}
?>
<?php
function format_csv($path_to_file,$character_to_repl,$character_to_repl2,$flag1,$flag2,$character_split){
if(strlen($character_to_repl)>1){
//echo 'Private Notes: character_to_repl should have max 1 character';
}
$uchwyt = fopen ($path_to_file,"r");
while (($data[] = fgets($uchwyt, 4096)) !== false) { }
fclose($uchwyt);
$count_data = count($data);
for($i=0;$i<$count_data;$i++){
$trimmed[] = trim($data[$i]," \t\n\r\0\x0B;");
$last_p = strrpos($trimmed[$i],$character_split);
$length_string = strlen($trimmed[$i])-1;
if($last_p==$length_string){
echo 'zgadza sie';
}else{
$trimmed[$i][$length_string+1]=$character_split;
}
}
for($h=0;$h<$count_data-1;$h++){
$newValue[] = explode($character_split,$trimmed[$h]);
}
for($o=0;$o<$count_data-1;$o++){
array_splice($newValue[$o],count($newValue[$o])-1);
$output[] = (remove_first_and_last_characters($newValue[$o],$character_to_repl,$character_to_repl2,$flag1,$flag2));
}
$outputs = null;
for($changeNumber=0;$changeNumber<$count_data-1;$changeNumber++){
$outputs .= '<tr>';
for($r=0;$r<count($output[$changeNumber]);$r++){
$outputs .= ('<td>'.$output[$changeNumber][$r].'</td>');
}
$outputs .= '</tr>';
}
return '<table>'.$outputs.'</table>';
}
?>
File testing.php:
<?php
include_once "oak1.php";
echo (format_csv('cache_or_not.csv','"','*',true,true,';'));
?>
Jak wykonuje/działa się funkcja format_csv()? Otóż wyjaśniam....
string format_csv(string $path_to_file,string $string1, string $string2, bool $boolean1, bool $boolean2, string $string3)
$path_to_file - ścieżka do pliku.
$string1 - znak, którego chcemy się pozbyć z pierwszej i ostatniej pozycji (zależne od następnych parametrów typu bool).
$string2 - znak, na który ma być zamieniony znak wymieniony w $string1. Gdy $string2 jest pusty, czyli "'"', to nie zamienia na żaden znak. Example: $string2='';.
$boolean1 - czy dokonywać zamiany czegokolwiek np. znaku podanego w drugim parametrze ($string1) na znak podany w trzecim ($string2).
$boolean2 - czy dokonywać zamiany znaku występującego na pierwszej i ostatniej pozycji w string'u.
$string3 - znak, po którym funkcja explode() rozbije string na tablicę, może to być np. znak ",", czy ";" lub jakiś inny.
Za wystąpienie jakichkolwiek bug'ów, czy niedomówień lub problemów z funkcją format_csv z góry przepraszam. Informuję, że używasz jej na własną odpowiedzialność. Jeśli napisałem coś nieścisłego w dokumentacji tej funkcji lub niechcący napisałem nieprawdę przepraszam raz jeszcze.