2015-07-22 11 views
10

Potrzebuję umieścić wszystkie ciągi znaków i liczby z podwójnymi cudzysłowami w pliku CSV za pomocą PHP.Załączenie każdego pola z podwójnymi cudzysłowami w pliku CSV za pomocą PHP?

Jak mogę utworzyć plik CSV z PHP we wszystkich danych w podwójnym cudzysłowie?

używam tego kodu, aby wygenerować plik CSV - Używam CodeIgniter ramy

$array = array(
    array(
    (string)'XXX XX XX', 
    (string)'3', 
    (string)'68878353', 
    (string)'', 
    (string)'[email protected]', 
    ), 
); 

$this->load->helper('csv'); 
array_to_csv($array, 'blueform.csv'); 

Wyjście Dostaję:

"XXX XX XX",3,68878353,,[email protected] 

oczekiwany wynik:

"XXX XX XX","3","68878353","","[email protected]" 

Kodeks array_to_csv

if (!function_exists('array_to_csv')) { 
    function array_to_csv($array, $download = "") { 
     if ($download != "") { 
      header('Content-Type: application/csv'); 
      header('Content-Disposition: attachement; filename="' . $download . '"'); 
     } 

     ob_start(); 
     $f = fopen('php://output', 'w') or show_error("Can't open php://output"); 
     $n = 0; 
     foreach ($array as $line) { 
      $n++; 
      if (!fputcsv($f, $line)) { 
       show_error("Can't write line $n: $line"); 
      } 
     } 
     fclose($f) or show_error("Can't close php://output"); 
     $str = ob_get_contents(); 
     ob_end_clean(); 

     if ($download == "") { 
      return $str; 
     } else { 
      echo $str; 
     } 
    } 
} 

góry dziękuję

+0

Po wpisaniu kodu związanego z tą funkcją "---->' 'array_to_csv' również –

+0

standardową praktyką przy plikach CSV jest zawijanie pól w cudzysłów, jeśli dane zawierają przecinek lub cudzysłowy. Tak właśnie działa funkcja PHP "fputcsv", a to jest to, czego można się spodziewać po prawie każdym oprogramowaniu do czytania CSV, z jakim kiedykolwiek miałem do czynienia. Czy istnieje szczególny powód, dla którego potrzebujesz czegoś innego? (Zgaduję, że importujesz dane do jakiegoś starego, chrupiącego oprogramowania, które egzekwuje surowe wymagania?) – Simba

+0

@Simba Mam konkretny powód dla tego ... Generuję ten plik CSV do przesłania na stronę rządu Singapuru, I nie mogę przesłać pliku do strony wygenerowanej przy użyciu PHP ... po porównaniu plików - jeden plik, który mogę przesłać i inny plik, który generuję przy użyciu php. Dowiedziałem się, że główną różnicą jest plik, w którym mogę przesłać podwójne cytaty we wszystkich wartościach – Anudeep

Odpowiedz

-1

Mam rozwiązanie ta funkcja konwersji wielu tablicę wymiar do CSV z podwójnym cudzysłowem i

function arr_to_csv($arr) 
    { 
     $filePointer="export.csv"; 
     $delimiter=","; 
     $enclosure='"'; 
     $dataArray =$arr; 

     $string = ""; 

     // No leading delimiter 
     $writeDelimiter = FALSE; 
     //foreach($dataArray as $dataElement) 
     foreach ($dataArray as $key1 => $value){ 
     foreach ($value as $key => $dataElement) 

     { 
      // Replaces a double quote with two double quotes 
      $dataElement=str_replace("\"", "\"\"", $dataElement); 
      // Adds a delimiter before each field (except the first) 
      // Encloses each field with $enclosure and adds it to the string 
      if($writeDelimiter) $string .= $delimiter; 
      // $new_string = $enclosure . $dataElement . $enclosure; 
      $string .= $enclosure . $dataElement . $enclosure; 
     // Delimiters are used every time except the first. 
      $writeDelimiter = TRUE; 
     } // end foreach($dataArray as $dataElement) 

       $string .= "\n"; 

     }  
     // Append new line 
     $string .= "\n";  
     //$string = "An infinite number of monkeys"; 
     print($newstring); 
     // Write the string to the file 
     // fwrite($filePointer,$string); 
     header('Content-Type: application/csv'); 
     header('Content-Disposition: attachment; filename="'.$filePointer.'";'); 
    } 
+0

Naprawdę nie rozumiem, dlaczego musisz dodać bałaganu do swoich ciągów, a następnie usunąć go później ... Dlaczego nie wystarczy dodać 'PHP_EOL' po zakończeniu wewnętrznego' foreach' zamiast dodawania '|||' ?A w jaki sposób skonfigurowałeś swój kod, nigdy nie powinieneś zobaczyć '|||,' dlaczego więc próbujesz zastąpić go nowym znakiem? Ustawiasz również wartość $ writeDelimiter na wartość true dla każdego przejścia funkcji, dlaczego nie chcesz zobaczyć, czy łańcuch jest pusty? – Canis

+0

@Canis Dokonałem zmiany kodu ... proszę sprawdzić, czy mam usunięty "||| ' to – Anudeep

5

Przy budowie CSV w PHP, należy użyć funkcji fputcsv dostępne od PHP 5

Z dokumentacji, nie ma następujące parametry:

int fputcsv (resource $handle , array $fields [, string $delimiter = "," [, string $enclosure = '"' [, string $escape_char = "\" ]]]) 

tym, że masz:

  • plik zasób piszesz do
  • dane umieścić w pliku CSV
  • z ogranicznikiem (przecinki zazwyczaj)
  • obudowy ciąg (jest to nieco chcesz dla swoich cytatów)
  • ucieczka ciąg (więc jeśli dane zawierają znak obudowy, można uciec się do uniknięcia to wygląda jak nowe pole)

jako domyślne dla że są , dla del imiter i " dla obudowy, nie musisz dodawać więcej. To poprawnie zakryje struny. Liczby to inna sprawa. Jest to obejść na this SO question które znalazłem po wpisaniu większość to i wtedy problemy z numerami jeszcze:

nie jest zadowolony z tego rozwiązania, ale to, co zrobiłem i działało. Idea polega na ustawieniu pustego znaku jako znaku klauzuli na fputcsv i dodaniu niektórych cytatów na każdym elemencie twojej tablicy.

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

fputcsv($handler, array_map(encodeFunc, $array), ',', chr(0)); 
+0

Mam zmieniona funkcja kodu test_fun() { \t \t $ tablica = tablica ( \t \t\t tablica ( \t \t \t \t $ to-> encodeFunc ('xx x x'), \t \t \t \t $ to-> encodeFunc ('3'), \t \t \t \t $ to-> encodeFunc (” 68878353 '), \t \t \t \t $ this-> encodeFunc (' '), \t \t \t \t $ this-> encodeFunc ('[email protected]'), \t \t \t \t \t), \t \t \t); \t // fputcsv ($ handler, array_map (encodeFunc, $ array), ',', chr (0)); \t \t // print_r ($ array); \t \t $ this-> load-> helper ('csv'); \t \t \t array_to_csv ($ array, 'blueform.csv'); } function encodeFunc ($ value) { return "\" $ value \ ""; } output: "" "xxxx xx xxx" "", "" "3" "", "" "68878353" "", "" "" "", "" "[email protected]" "" – Anudeep

0

zmiany kodu trochę.

fputcsv($f, $line) 

Aby

fputcsv($f,array_map('strval', $line), ',', '"') 

Nadzieja to pomoże.

FYI: jej w array_to_csv

1

ja używam CSV pomocnika tutaj.

Do generowania wyników z zapytania db dla przykładu.

$sTable = "MY_TABLE_NAME"; 

$query = $this->db->get($sTable); 

$this->load->helper('csv'); 

query_to_csv($query, TRUE, 'records.csv'); 

Pomocnik CSV onLine numer 65 Istnieje kod dla zapytania_to_csv.

tutaj jest csv_helper.php.

Zrobiłem małą edycję, jeśli chcesz wszystko z podwójnym odwróconym przecinkiem.

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

// ------------------------------------------------------------------------ 

/** 
* CSV Helpers 
* Inspiration from PHP Cookbook by David Sklar and Adam Trachtenberg 
* 
* @author  Jérôme Jaglale 
* @link  http://maestric.com/en/doc/php/codeigniter_csv 
*/ 

// ------------------------------------------------------------------------ 

/** 
* Array to CSV 
* 
* download == "" -> return CSV string 
* download == "toto.csv" -> download file toto.csv 
*/ 
if (! function_exists('array_to_csv')) 
{ 
    function array_to_csv($array, $download = "") 
    { 
     if ($download != "") 
     { 
      header('Content-Type: application/csv'); 
      header('Content-Disposition: attachement; filename="' . $download . '"'); 
     }  

     ob_start(); 
     $f = fopen('php://output', 'w') or show_error("Can't open php://output"); 
     $n = 0;  
     foreach ($array as $line) 
     { 
      $n++; 
      if (! fputcsv($f, $line)) 
      { 
       show_error("Can't write line $n: $line"); 
      } 
     } 
     fclose($f) or show_error("Can't close php://output"); 
     $str = ob_get_contents(); 
     ob_end_clean(); 

     if ($download == "") 
     { 
      return $str;  
     } 
     else 
     { 
      echo $str; 
     }  
    } 
} 

// ------------------------------------------------------------------------ 

/** 
* Query to CSV 
* 
* download == "" -> return CSV string 
* download == "toto.csv" -> download file toto.csv 
*/ 
if (! function_exists('query_to_csv')) 
{ 
    function query_to_csv($query, $headers = TRUE, $download = "") 
    { 
     if (! is_object($query) OR ! method_exists($query, 'list_fields')) 
     { 
      show_error('invalid query'); 
     } 

     $array = array(); 

     if ($headers) 
     { 
      $line = array(); 
      foreach ($query->list_fields() as $name) 
      { 
       $line[] = '"'.$name.'"'; 
      } 
      $array[] = $line; 
     } 

     foreach ($query->result_array() as $row) 
     { 
      $line = array(); 
      foreach ($row as $item) 
      { 
       $line[] = '"'.$item.'"'; 
      } 
      $array[] = $line; 
     } 

     echo array_to_csv($array, $download); 
    } 
} 

/* End of file csv_helper.php */ 
/* Location: ./system/helpers/csv_helper.php */ 

Spowoduje to wstawienie Wstaw podwójny przecinek w nazwie kolumny oraz w wierszach. Możesz również usunąć "" to z nazwy kolumny.

enter image description here

+0

Potrzebuję podwójnych cudzysłowów, gdy otwierasz plik CSV w edytorze tekstu ... jeśli otworzysz ten plik w edytorze tekstowym, wyświetli się "" UI "" taki jak ten @bugfixer – Anudeep

+0

@Audeudeep - Ale gdzie wspomniałeś, że chcesz otworzyć ten plik w edytorze tekstu – Bugfixer

+0

Przeczytaj ten [link] (http://superuser.com/a/349900), aby lepiej zrozumieć zachowanie pliku CSV. – Bugfixer

0

I pewnie właśnie zastąpić fputcsv z domu uprawiane wersji. Teraz tworzę strukturę danych, aby zawsze była siatką, jak tradycyjne arkusze kalkulacyjne i pliki CSV.

function getQuotedString($arr){ 
    $buffer = ""; 
    foreach($arr as $line){ 
     $string = ""; 
     foreach($line as $data){ 
      // See if $string is no longer empty, meaning we need a comma to separate data 
      if($string !== "") $string .= ','; 
      $string .= '"' . $data . '"'; 
     } 
     $buffer .= $string . PHP_EOL; 
    } 
    return $buffer; 
} 

teraz używać, że w kodzie:

... 
ob_start(); 
$f = fopen('php://output', 'w') or show_error("Can't open php://output"); 
$quotedData = getQuotedString($arr); 

for ($written = 0; $written < strlen($data); $written += $fwrite) { 
    $fwrite = fwrite($f, substr($data, $written)); 
    if ($fwrite === false) { 
     return $written; 
    } 
} 

fclose($f) or show_error("Can't close php://output"); 
$str = ob_get_contents(); 
ob_end_clean(); 
... 

Następnie można użyć $ napisany, aby zobaczyć, jak wiele bajtów zostały napisane, lub jeśli chcesz wiedzieć, ile wierszy nie było można po prostu użyć sizeof ($ arr).

Mam nadzieję, że to pomoże!

0

nie miałby funkcja pracy implode pięknie do tego?

$array = [ 
(string)'XXX XX XX', 
(string)'3', 
(string)'68878353', 
(string)'', 
(string)'[email protected]' 
]; 
$csvData = '"' . implode('","', $array) . '"'; 

, a następnie można po prostu zapisać $ csvData do pliku?

0

Oczywiście istnieją inne sposoby radzenia sobie z tym, ale za pomocą fputcsv i działa dla większości scenariuszy.

if(!function_exists('array_to_csv')) { 
    function array_to_csv($array, $download = "") { 
     ob_start(); 
     $f = fopen('php://output', 'w') or die("Can't open php://output"); 
     $counter = count($array); 
     for ($i = 0; $i < $counter; $i++) { 
      if(!fputcsv($f, array_map(function($value) { return '"'.$value.'"'; }, $array[$i]), ",", "\"")) { 
       die("Can't write line $i: ".print_r($array[$i], true)); 
      } 
     } 
     fclose($f) or die("Can't close php://output"); 
     $str = str_replace('"""', '"', ob_get_contents()); 
     ob_end_clean(); 

     if(strlen($download) > 0) { 
      header('Content-Type: application/csv'); 
      header('Content-Disposition: attachment; filename="'.$download.'"'); 
      echo $str; 
     } else { 
      return $str; 
     } 
    } 
} 
0

Nie należy podejmować wysiłków związanych z prawidłowym zamknięciem każdego pliku z podwójnymi cudzysłowami. Istnieją wbudowane funkcje php dostępne do wykonania pracy bez błędów.

Nie tylko cudzysłowy, będziesz w potrzebie pojedynczy cudzysłów ('), podwójny cudzysłów ("), backslash (\) oraz NULL (bajt NULL).

Użyj fputcsv() do napisania, a następnie odczytaj fgetcsv(), która zajmie się wszystkimi.

0

Można użyć implode() function aby powyższy kod jeszcze bardziej prosta:

$delimiter = ';'; 
$enclosure = '"'; 
$linefeed = "\n"; 

$lines = array(); 
// traversing data, one row at a time 
foreach ($data as $row) { 
    $arr = array(); 
    // traversing row, col after col 
    foreach ($row as $col => $val) { 
     // MySQL-style escaping double quotes 
     $val = str_replace('"','""',$val); 
     // wrapping each value in double quotes 
     $arr[] = sprintf('%s%s%s',$enclosure,$val,$enclosure); 
    } 
    // generating formatted line and storing it 
    $lines[] = implode($delimiter,$arr); 
} 
// join each lines to have the final output 
$output = implode($linefeed,$lines); 
echo $output; 
1

Concat napisu z tym '"""';

Przykład: '"""' . {{String}} . '"""';

To powinno działać, pracował dla mnie . To jest sposób na zamknięcie łańcucha.

Powiązane problemy