• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

fgetcsv i problem cudzysłowu zawartego w tekście

Object Storage Arubacloud
+1 głos
248 wizyt
pytanie zadane 29 listopada 2017 w PHP przez Bartess Gaduła (3,630 p.)
edycja 29 listopada 2017 przez Bartess

Cześć.
Być może banalne. Jest na to jakiś sposób, czy trzeba „rozkminiać” ręcznie?
Plik test.csv:

"lp";"nazwa firmy";"adres"
"1";"Bolek sc";"aaa"

Plik php:

<?php
echo "<pre>";
$uchwyt = fopen ("test.csv","r");
while (($data = fgetcsv($uchwyt, 1000, ";")) !== FALSE)  {
    $num = count($data);
    for ($c=0; $c < $num; $c++) {
    echo $data[$c] . "\t|\t";
    }echo "\n";
}fclose ($uchwyt);
?>

daje to:

lp	|	nazwa firmy	|	adres	|	
1	|	Bolek sc	|	aaa     |	

Jak zrobić, żeby plik CSV zawierający np (nazwa Bolek w cudzysłowie):

"lp";"nazwa firmy";"adres"
"1";""Bolek" sc";"aaa"

dawał to:

lp	|	nazwa firmy	|	adres	|	
1	|	"Bolek" sc	|	aaa     |	

a nie  to, jak daje teraz:

lp	|	nazwa firmy	|	adres	|	
1	|	Bolek" sc"	|	aaa     |	

?

Myślałem, żeby w linijce:
while (($data = fgetcsv($uchwyt, 1000, ";", '­°')) !== FALSE)  {   
jako ogranicznika użyć znaku,jaki nie jest użyty w pliku csv.

Wtedy dostanę coś takiego:

"lp"	|	"nazwa firmy"	|	"adres"	|	
"1"	|	""Bolek" sc"	|	"aaa"	|

i „ręcznie” „zrzucać” z każdej wartości cudzysłów z początku i końca jej wartości.
Przy okazji-jak najłatwiej „zrzucić” pierwszy i ostatni znak,pod warunkiem, że jest on cudzysłowem? 

Dzięki.

1 odpowiedź

0 głosów
odpowiedź 1 grudnia 2017 przez Chess Szeryf (76,710 p.)
edycja 1 grudnia 2017 przez Chess

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.

Podobne pytania

0 głosów
2 odpowiedzi 134 wizyt
pytanie zadane 7 maja 2020 w C# przez Avalansz Użytkownik (580 p.)
0 głosów
2 odpowiedzi 6,214 wizyt
pytanie zadane 17 marca 2016 w C i C++ przez Janusz programowania Bywalec (2,710 p.)
0 głosów
1 odpowiedź 163 wizyt
pytanie zadane 3 czerwca 2015 w C i C++ przez CodeBlocksCPP Obywatel (1,010 p.)

92,568 zapytań

141,424 odpowiedzi

319,634 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...