2009-11-25 22 views
32

Có hàm gốc hoặc lớp/thư viện vững chắc để viết mảng dưới dạng dòng trong tệp CSV không có thùng chứa không? fputcsv sẽ mặc định là " nếu không có gì được chuyển cho tham số bao vây. Google không thực hiện được tôi (trả lại kết quả cho toàn bộ một loạt các trang về số fputcsv) và thư viện của PEAR thực hiện nhiều hơn hoặc ít hơn những thứ tương tự như fputcsv.Viết CSV vào tệp mà không có phần đính kèm Trong PHP

Điều gì đó hoạt động chính xác như fputcsv, nhưng sẽ cho phép các trường vẫn không được bỏ phiếu.

hiện: "field 1","field 2",field3hasNoSpaces

mong muốn: field 1,field 2,field3hasNoSpaces

+6

Tôi nghĩ rằng bạn cần báo giá .. nếu có một ký tự dòng mới hoặc dấu phẩy trong đó và chúng không trích dẫn được phân tách? – alex

+1

Báo giá có lợi ích cho bạn. Đó là một thực hành tốt để sử dụng chúng; đó là lý do tại sao chúng là mặc định. –

+5

Tôi không đồng ý; nếu bạn có quyền kiểm soát dữ liệu đầu vào, bạn có thể bỏ qua các thùng chứa, đặc biệt nếu bạn có thể xuất tất cả dữ liệu chuỗi số/chuỗi đã lọc sang một trình đọc cổ xưa. Một thứ khác là các tệp được phân tách bằng tab: Không cần thùng chứa. –

Trả lời

42

Cảnh báo về các thùng chứa nói trên là hợp lệ, nhưng bạn đã nói rằng chúng không áp dụng cho trường hợp sử dụng của bạn.

Tôi tự hỏi tại sao bạn không thể chỉ sử dụng một cái gì đó như thế này?

<?php 
$fields = array(
    "field 1","field 2","field3hasNoSpaces" 
); 
fputs(STDOUT, implode($fields, ',')."\n"); 
+0

Dunno lý do tại sao tôi đã không đi đến này đầu tiên. Cảm ơn! –

+0

Bởi vì thư viện CSV xử lý các trường hợp giải pháp implode đơn giản của bạn doen't, giống như định hình ký tự dấu tách (',' trong trường hợp của bạn). – jgomo3

+0

Đây là cách tốt nhất để thay thế fputcsv mà không có thùng loa. Tôi sẽ đưa ra một gợi ý nhỏ để cải thiện câu trả lời này - sử dụng thứ tự đối số được ghi lại cho [implode] (http://php.net/manual/en/function.implode.php): 'implode (chuỗi $ glue, mảng $ pieces) 'để tránh nhầm lẫn với những người mới sử dụng PHP và không biết tính năng" PHP "này của các đối số được đảo ngược. – hrvoj3e

0

Đây là những gì tôi sử dụng để đặt CSV tiêu chuẩn vào một mảng ...

function csv_explode($delim=',', $str, $enclose='"', $preserve=false){ 
     $resArr = array(); 
     $n = 0; 
     $expEncArr = explode($enclose, $str); 
     foreach($expEncArr as $EncItem){ 
       if($n++%2){ 
         array_push($resArr, array_pop($resArr) . ($preserve?$enclose:'') . $EncItem.($preserve?$enclose:'')); 
       }else{ 
         $expDelArr = explode($delim, $EncItem); 
         array_push($resArr, array_pop($resArr) . array_shift($expDelArr)); 
         $resArr = array_merge($resArr, $expDelArr); 
       } 
     } 
     return $resArr; 
} 

Bạn có thể sau đó đầu ra bất cứ điều gì bạn muốn trong một foreach vòng lặp.

2

Điều này có hiệu quả không?

fputcsv($fp, split(',', $line),',',' '); 
+0

Chia sẽ là chức năng không được dùng nữa và điều này không nhất thiết phải giải quyết vấn đề của tôi . Thật không may, không gian không được coi là một nhân vật hợp pháp ít nhất là như xa như chức năng này là có liên quan. Cảm ơn mặc dù! –

+0

Giả sử không gian thêm không phải là một vấn đề, có vẻ như anh ta đang tìm kiếm * no * enclosure; tuy nhiên, việc sử dụng một không gian có vẻ như là điều hợp lý để thử. –

0

Nhược điểm với tệp CSV không có vỏ bọc có nghĩa là dấu phẩy trong đầu vào của người dùng sẽ làm gián đoạn hàng. Vì vậy, bạn sẽ cần xóa dấu phẩy trước khi viết hàng CSV.

Phần khó khăn khi xử lý CSV là phân tích cú pháp, làm cho hàm PHP PEPEAR có giá trị. Về cơ bản bạn đang tìm kiếm một tệp được phân cách bằng dấu phẩy cho các cột và được phân cách bằng dòng mới cho các hàng. Đây là một điểm khởi đầu đơn giản:

<?php 
$col_separator= ','; 
$row_separator= "\n"; 

$a= array(
array('my', 'values', 'are', 'awes,breakit,ome'), 
array('these', 'values', 'also', "rock\nAND\nROLL") 
); 

function encodeRow(array $a) { 
global $col_separator; 
global $row_separator; 
// Can't have the separators in the column data! 
$a2= array(); 
foreach ($a as $v) { 
    $a2[]= str_replace(array($col_separator, $row_separator), '', $v); 
} 
return implode($col_separator, $a2); 
} 

$output= array(); 
foreach ($a as $row) { 
$output[]= encodeRow($row); 
} 

echo(implode($row_separator, $output)); 

?> 
-3

Đã tìm ra. Bằng cách chuyển mã ascii cho Null vào hàm car(), nó có vẻ hoạt động tốt.

fputcsv($f, $array, $delimiter, car(0))

Cảm ơn câu trả lời của tất cả mọi người !!!

+3

Hmm ... bạn có chắc chắn nó sẽ không đặt một loạt các null tàng hình trong tập tin csv? : s Ngoài ra, tôi nghĩ rằng đó là 'chr (0)' -! –

+2

Đặt NULL cho tôi. Không phải là giải pháp lý tưởng. – Shadowbob

1

Vâng car(0) không hoạt động vì giá trị NULL rất có thể sẽ gây ra hầu hết các trình phân tích cú pháp csv.

Tôi đã kết thúc bằng cách sử dụng fputcsv() để tạo tệp ban đầu, sau đó đi qua và xóa tất cả các trích dẫn. Thanh lịch? Có lẽ không, nhưng nó đã hoàn thành công việc :).

8

làm việc với chr() chức năng:

fputcsv($f,$array,',',chr(0)); 
+2

-1 không hoạt động đối với tôi – mkk

+4

Dường như trong tệp UTF-8 không hoạt động chính xác – terox

+3

chr (0) tạo null char được hiển thị trong utf8 như^@ – Mike

0

chr(0) cũng làm việc cho tôi:

fputcsv($fp, $aLine, $sDelimiter, chr(0)); 
+1

Tôi nghĩ rằng nó hoạt động vì trình soạn thảo của bạn không hiển thị cho bạn char rỗng, nhưng nó vẫn còn đó – nickel715

1
<?php  

$filename = "sample.csv"; 
$handle = fopen($filename, 'w+'); 
fputcsv($handle, ['column 1','column 2']); 
$data = ['sample','data']; 

fputs($handle, implode($data,',')."\n"); 

// or 

fwrite($handle, implode($data,',')."\n"); 

fclose($handle); 
$headers = array(
    'Content-Type' => 'text/csv', 
); 
1

fputcsv($file, $data, ';', chr(127));

Các vấn đề liên quan