PHP thoát dấu phẩy cho CSV

Vấn đề là tệp CSV chứa giá trị bằng dấu phẩy và nó đọc giá trị thoát [có dấu ngoặc kép] như hiện tại

E. g.

$data = fgetcsv[$handle,1000,",","'"];
0 được đọc là
$data = fgetcsv[$handle,1000,",","'"];
1 &
$data = fgetcsv[$handle,1000,",","'"];
2 &
$data = fgetcsv[$handle,1000,",","'"];
3

Vấn đề có thể được giải quyết bằng cách thay đổi dấu ngoặc kép thành dấu ngoặc đơn. Tuy nhiên, tôi không muốn chỉnh sửa mọi tệp CSV mọi lúc

Mã mà tôi sử dụng là như sau

$handle = fopen[$path, "r"];
$data = fgetcsv[$handle,1000,",","'"];
do
{
    **READ CSV**
}
while [$data = fgetcsv[$handle,5000,","]];

Điều gì sẽ là cách tốt nhất để xử lý vấn đề này?

Giải pháp tốt nhất

Thay đổi dòng này

$data = fgetcsv[$handle,1000,",","'"];

đến

$data = fgetcsv[$handle,1000,",",'"'];

hoặc chỉ bỏ qua hai tham số cuối cùng vì chúng là giá trị mặc định

$data = fgetcsv[$handle,1000];

Tham số thứ tư cho fgetcsv là ký tự bao vây cho biết cách đóng khung các trường có thể có dấu phân cách bên trong chúng

Giải pháp liên quan

Mysql – Cách xuất kết quả truy vấn MySQL ở định dạng CSV

Từ Lưu kết quả truy vấn MySQL vào tệp văn bản hoặc tệp CSV

SELECT order_id,product_name,qty
FROM orders
WHERE foo = 'bar'
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

Ghi chú. Cú pháp đó có thể cần phải được sắp xếp lại để

SELECT order_id,product_name,qty
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM orders
WHERE foo = 'bar';

trong các phiên bản mới hơn của MySQL

Sử dụng lệnh này, tên cột sẽ không được xuất

Cũng lưu ý rằng

$data = fgetcsv[$handle,1000,",","'"];
0 sẽ có trên máy chủ đang chạy MySQL. Người dùng mà quy trình MySQL đang chạy bên dưới phải có quyền ghi vào thư mục đã chọn, nếu không lệnh sẽ thất bại

Nếu bạn muốn ghi đầu ra vào máy cục bộ của mình từ máy chủ từ xa [đặc biệt là máy được lưu trữ hoặc máy ảo hóa như Heroku hoặc Amazon RDS], thì giải pháp này không phù hợp

Excel – Tạo tệp CSV cho Excel, cách có một dòng mới bên trong một giá trị

Bạn chỉ nên có các ký tự khoảng trắng ở đầu các trường khi các ký tự khoảng trắng là một phần của dữ liệu. Excel sẽ không loại bỏ các khoảng trắng ở đầu. Bạn sẽ nhận được khoảng trống không mong muốn trong tiêu đề và trường dữ liệu của mình. Tồi tệ hơn,

$data = fgetcsv[$handle,1000,",","'"];
1 lẽ ra phải "bảo vệ" ngắt dòng đó trong cột thứ ba sẽ bị bỏ qua vì nó không ở đầu trường

Nếu bạn có các ký tự không phải ASCII [được mã hóa bằng UTF-8] trong tệp, thì bạn phải có BOM UTF-8 [3 byte,

$data = fgetcsv[$handle,1000,",","'"];
2] ở đầu tệp. Nếu không, Excel sẽ diễn giải dữ liệu theo mã hóa mặc định của ngôn ngữ của bạn [e. g. cp1252] thay vì utf-8 và các ký tự không phải ASCII của bạn sẽ bị chuyển vào thùng rác

PHP có một số chức năng tuyệt vời để phân tích cú pháp và xuất ra các tệp giá trị được phân tách bằng dấu phẩy [CSV], nhưng nó không thành công khi trả về dữ liệu đó dưới dạng chuỗi. Chắc chắn, bạn có thể ánh xạ qua mảng bằng

$data = fgetcsv[$handle,1000,",","'"];
4, nhưng kết quả của việc đó sẽ như thế nào nếu bạn đang xử lý thông tin có chứa dấu phẩy trong chính các giá trị đó?

Trước hết, các chức năng sau được hỗ trợ bởi PHP out-of-the-box

  • fgetcsv - Tương tự như fgets[] ngoại trừ việc fgetcsv[] phân tích cú pháp dòng nó đọc cho các trường ở định dạng CSV và trả về một mảng chứa các trường đã đọc
  • fputcsv - Định dạng một dòng [được truyền dưới dạng một mảng trường] dưới dạng CSV và ghi nó [được kết thúc bởi một dòng mới] vào phần xử lý tệp đã chỉ định
  • str_getcsv - [PHP 5. 3. 0 +] Phân tích cú pháp đầu vào chuỗi cho các trường ở định dạng CSV và trả về một mảng chứa các trường đã đọc

Đoạn mã bên dưới triển khai một str_putcsv mới, dự kiến ​​một mảng gồm các mảng kết hợp và trả về một chuỗi có định dạng CSV

/**
 * Convert a multi-dimensional, associative array to CSV data
 * @param  array $data the array of data
 * @return string       CSV text
 */
function str_putcsv[$data] {
        # Generate CSV data from array
        $fh = fopen['php://temp', 'rw']; # don't create a file, attempt
                                         # to use memory instead

        # write out the headers
        fputcsv[$fh, array_keys[current[$data]]];

        # write out the data
        foreach [ $data as $row ] {
                fputcsv[$fh, $row];
        }
        rewind[$fh];
        $csv = stream_get_contents[$fh];
        fclose[$fh];

        return $csv;
}

Phần kết luận

Chức năng trên đã phát triển từ một năm viết tập lệnh xuất dữ liệu để phân phối email. Có các chức năng khác thực hiện chuyển đổi định dạng sang CSV, nhưng một số giới thiệu chi phí bổ sung để khắc phục các thiếu sót của định dạng CSV. Điều tôi thích là đoạn mã trên rõ ràng và ngắn gọn. Bằng cách gia công phần mềm nặng cho hàm

$data = fgetcsv[$handle,1000,",","'"];
5 tích hợp sẵn của PHP, nó không cần phải liên quan đến những thứ như
$data = fgetcsv[$handle,1000,",","'"];
6 để thoát các giá trị CSV bằng dấu phẩy hoặc dấu ngoặc kép

Làm cách nào để xử lý dấu phẩy trong tệp CSV PHP?

Xử lý tệp CSV có giá trị dữ liệu dấu phẩy bằng PHP . Vì vậy, tôi đã tạo một đầu vào. csv chứa các giá trị có ký tự Dấu phẩy [,]. Nội dung file sẽ được như hình bên dưới. Fields containing line breaks [CRLF], double quotes, and commas should be enclosed in double-quotes. So, I have created an input. csv containing values with Comma[,] character. The file content will be as shown as below.

Làm cách nào để thoát các ký tự trong PHP?

Trình tự thoát . Trình tự thoát áp dụng cho chuỗi trích dẫn kép. Chuỗi trích dẫn đơn chỉ sử dụng chuỗi thoát cho một trích dẫn hoặc dấu gạch chéo ngược. an escape sequence starts with a backslash \ . Escape sequences apply to double-quoted strings. A single-quoted string only uses the escape sequences for a single quote or a backslash.

Làm cách nào để đọc tệp CSV bằng php?

PHP có hai chức năng sẵn có để đọc tệp CSV. .
fgetcsv[] – Đọc CSV bằng tham chiếu của tài nguyên tệp
str_getcsv[] – Đọc dữ liệu CSV được lưu trữ trong một biến

Làm cách nào để tạo tệp CSV trong PHP từ mảng?

Để chuyển đổi một mảng thành tệp CSV, chúng ta có thể sử dụng hàm fputcsv[] . Hàm fputcsv[] được sử dụng để định dạng một dòng dưới dạng tệp CSV [các giá trị được phân tách bằng dấu phẩy] và ghi nó vào một tệp đang mở.

Chủ Đề