Đọc file csv trong php

Đọc file csv trong php

Hi các bạn,

Hôm nay có dịp đụng lại CSV, cụ thể là import CSV để thêm dữ liệu. Nên sẵn dịp log lại 1 bài luôn ý mà.

CSV (Comma-seperated values) là một dạng file khá phổ biến từ lâu đời nay, cụ thể là nó lưu 1 danh sách, các giá trị của nó được phân cách bởi dấu “,”. Không chỉ vậy CSV cũng có thể được phân cách bằng character “TAB” (\t). Nhưng dùng dấu phẩy vẫn là thông dụng nhất.

Vẫn còn rất nhiều hệ thống người ta ưu tiên sử dụng file này để import vì:

  • Nhẹ
  • Đơn giản
  • Hỗ trợ rộng rãi từ Excel, Google Spreadsheet, OpenOffice,…. Thậm chí Notepad mở lên xem bình thường
  • Đỡ fải thông qua 1 Library nào đó để đọc xls hay xlsx (giảm dependencies)

Tất nhiên nó ko fải vô đối, vẫn có cái dở của nó. Nhưng thoy kệ đi vào bài chính đã 😀

1/ PHP Native function fgetcsv

Đúng vậy, PHP có sẵn function này cho các bạn sử dụng. Hàm này available từ PHP tới giờ nhé. Khá ok.

Mặc định cái delimiter sẽ là dấu phẩy “,”. Các bạn muốn thay đổi thì bỏ delimiter của bạn vào tham số thứ 3 nhé. Tìm hiểu thêm function này tại: https://www.php.net/manual/en/function.fgetcsv.php

Vậy để get csv ra array thì ta làm như sau:

Khá đơn giản fải ko nào. Khi process nhớ check cho kỹ nhé kẻo bị offset error 😀

2/ Test cases về vụ Lấy thông tin CSV file

Mình đã test trên các trường hợp sau:

  • CSV bình thường, cơ bản: ✔ (nhanh và ngon lành)
  • CSV độ phức tạp cao, có column lẫn lộn xuống dòng và có cả dấu “,” (nguy hiểm): ✔ (ngon lành, ko mắc lỗi này và vẫn nhận ra 1 row tốt, một số cách khác như str_getcsv có thể bị mắc vào lỗi này). Đôi khi ta cũng đừng tin tưởng vào 1-line-code.

Advantages khi các bạn xài cách này:

  • Đọc CSV chuẩn row, ko lo sai data
  • Không fải lệ thuộc bất kỳ library nào vì cái này đã build-in sẵn trong PHP, very good
  • Đọc file theo con trỏ (fopen, fget,…). Rất có lợi cho các bạn đọc file lớn mà ko lo bị dirrupted or out of memory. Những cách 1 dòng đa phần nó sẽ đọc cả file và đưa vào memory => tràn bộ nhớ là chuyện bt.
  • Vừa đọc file vừa xử lý (import, process,…) luôn.

Disadvantages khi các bạn xài cách này:

  • Chưa nghĩ ra, chắc code dài hơn mấy đoạn 1-line-code =))

3/ Finalization về Lấy thông tin CSV file

Theo cách này, điều mình và các bạn nên quan tâm nhất đó là: chuẩn data và đọc theo con trỏ. Nó sẽ rất có lợi đấy nhé 😀

Cám ơn các bạn đã quan tâm vềbài viết này: “Lấy thông tin CSV file”

Đọc file csv trong php

Mình là Phát - biệt danh Seth Phát. Hiện đang là một Sr. Full-Stack Engineer. Mình là một người yêu thích và đam mê lập trình và hiện tại đang theo về phần Web là chủ yếu. Mạnh Back-end và khá Front-end, vẫn đang theo đều cả 2 :v. Còn gì bằng khi được làm những thứ mà mình yêu thích, đam mê ;)

Tìm hiểu cách đọc và ghi tệp CSV trong PHP. Khám phá các mẹo nâng cao để lọc hàng, phân tích cú pháp tệp CSV một triệu dòng trong khi sử dụng bộ nhớ thấp và hơn thế nữa!

CSV cho các Giá trị được Phân tách bằng Dấu phẩy là một định dạng tệp được thiết lập tốt để nhập và xuất dữ liệu.

< p> Trong hướng dẫn này, chúng ta sẽ học cách đọc và ghi tệp CSV bằng PHP với sự trợ giúp của các ví dụ.

Chúng ta cũng sẽ khám phá cách thực hiện các thao tác phổ biến nhất như lọc, sắp xếp và chuyển đổi dữ liệu.

Cuối cùng nhưng không kém phần quan trọng, chúng ta sẽ học cách phân tích cú pháp tệp CSV gồm 1 triệu dòng trong PHP theo cách nhanh chóng và tiết kiệm bộ nhớ.

Tôi đã sử dụng PHP8 trong khi viết mã và kiểm tra các ví dụ:

  • Các ví dụ với các hàm gốc tương thích với các phiên bản PHP rất cũ.
  • Các ví dụ sử dụng league / csv yêu cầu phiên bản PHP7 là tối thiểu.
  • toàn bộ mã và ví dụ đều có sẵn trong kho lưu trữ GitHub; nó được đóng gói như một dự án Symfony đơn giản và cung cấp hình ảnh Docker.

Chúng tôi sẽ sử dụng tệp CSV chứa dữ liệu về phim trong hướng dẫn này.

Đây là mẫu của tập dữ liệu này ở dạng văn bản thuần túy:

  

id, tiêu đề, người đăng, tổng quan, ngày phát hành, thể loại

181808," Star Wars: The Last Jedi ", https: //.../mWII.jpg," Rey phát triển khả năng mới được khám phá của mình với sự hướng dẫn của Luke Skywalker, [...] ", 1513123200, "Phim tài liệu"

383498, "Deadpool 2", https: //.../3VAd .jpg, "Deadpool lính đánh thuê Wisecracking chiến đấu với Cable độc ​​ác và mạnh mẽ cùng [...]", 1526346000, "Action, Comedy, Adventure", mã thông báo "Action, Comedy, Adventure"

157336," Interstellar ", https: //.../BvIx.jpg," Interstellar biên niên sử a bản phát minh của một nhóm nhà thám hiểm sử dụng [...] ", 1415145600," Phiêu lưu, Chính kịch, Khoa học viễn tưởng "


Thông thường, ở định dạng CSV:

  1. Dòng đầu tiên chứa các tiêu đề
  2. Mỗi dòng sau là một hàng dữ liệu
  3. Dấu phẩy phân tách từng ô liên tiếp
  4. Một dấu ngoặc kép bao gồm các ô chứa văn bản

Đôi khi, chúng ta có thể tìm các ký tự khác nhau để phân tách dữ liệu, đóng gói chuỗi hoặc thoát các ký tự đặc biệt. < / p>

Hãy xem tệp mẫu của chúng tôi theo cách dạng bảng:

idtitleposteroverviewrelease_dategenres181808Star Wars: The Last Jedihttps: //.../mWII.jpgRey phát triển khả năng mới được khám phá của mình với sự hướng dẫn của Luke Skywalker, [ ...] 1513123200Documentary383498Deadpool 2https: //.../3VAd.jpgKiểm tra lính đánh thuê Deadpool chiến đấu với Cable độc ​​ác và mạnh mẽ và những kẻ xấu khác [...] 1526346000Action, Comedy, Adventure157336Interstellarhttps: //.../BvIx.jpgInterstellar biên niên sử các cuộc phiêu lưu của một nhóm nhà thám hiểm m ake sử dụng [...] 1415145600 Quảng cáo, Phim truyền hình, Khoa học viễn tưởng

Các bước để đọc tệp CSV trong PHP với các hàm gốc:

  1. Mở tệp bằng fopen < / code> sử dụng chế độ đọc
  2. Phân tích cú pháp các hàng CSV từ tệp bằng fgetcsv
  3. Đóng tệp bằng fclose < / li>
  

$ đường dẫn

=

'data / movies-100.csv'

;

$ handle

=

fopen

(

$ path

,

"r"

)

;

< br />

while

(

(

$ row

=

fgetcsv

(

$ xử lý

)

)

! ==

false

)

{

var_dump

(

$ row

)

;

}

fclose

(

$ xử lý

)

;


Nó tải mỗi hàng dưới dạng một mảng; hàng đầu tiên chứa các tiêu đề.

 

// tiêu đề

mảng (6) {

[0] = & gt;

string (2) "id"

[1] = & gt;

chuỗi (5) "title"

[2] = & gt;

string (6) "bài viết"

[3] = & gt;

[4] = & gt;

chuỗi (12) "release_date"


[5] = & gt;

string (6)" thể loại "

}

// một hàng khác

mảng (6) {

[0] = & gt;

string (3)" 807 "


[1] = & gt;

string (5) "See7"

[2] = & gt;

string (63) "https://image.tmdb.org/t/p/w500/6yoghtyTpznpBik8EngEmJskVUO.jpg"

[3] = & gt;

string (390)" Hai ngôi nhà Các thám tử icide đang truy lùng ráo riết một kẻ giết người hàng loạt có tội ác dựa trên 'bảy tội lỗi chết người' trong bộ phim đen tối và ám ảnh này đưa người xem đi từ phần còn lại bị tra tấn của nạn nhân này đến nạn nhân khác. Det dày dạn kinh nghiệm. Sommerset nghiên cứu từng cảnh trong nỗ lực đi sâu vào tâm trí của kẻ giết người, trong khi đối tác mới của anh ta, Mills, chế giễu nỗ lực của anh ta để làm sáng tỏ vụ án. "Line">

[4] = & gt; < / p>

string (9) "811731600" [5] = & gt;

string (24)" Tội phạm, Bí ẩn, Kinh dị "


< p class = "token-line">

}


Trong một số trường hợp, chúng tôi muốn thao túng các hàng độc lập

     

$ row

=

[

]

;

< p class = "mã thông báo đồng bằng">

$ xử lý

=

fopen

(

$ đường dẫn

, < / p>

;

trong khi

(

(

$ row

=

fgetcsv

(

$ xử lý

)

)

! ==

< / p>

false

)

{

< / p>

$ lines

[

]

=

$ row

;

}

fclose

(

< p class = "biến mã thông báo"> $ xử lý

)

;


< br />

$ headers

=

array_shift

< p class = "dấu câu mã thông báo"> (

$ row

)

;


$ mảng

=

< p class = "mã thông báo p unctuation "> [

]

;

< br />

foreach

(

$ hàng

< p class = "từ khóa mã thông báo"> dưới dạng

$ row

) < / p>

$ mảng

[

]

=

array_combine

(

$ headers

,

$ row

)

;

}

var_dump < / p>

(

$ mảng

)

;


Giờ đây, chúng ta có mỗi hàng dưới dạng một mảng kết hợp, với các tiêu đề là chỉ mục của mỗi mảng. Chúng tôi có thể thao tác các hàng một cách độc lập như các đối tượng JSON đơn giản.

  

mảng (100) {

[0] = & gt;

mảng (6) {

["id"] = & gt;

string (6)" 287947 "

["title"] = & gt;

string (7) "Shazam!"

["poster"] = & gt;

string (63) "https://image.tmdb.org/t/p/w500/xnopI5Xtky18MPhK40cZAGAOVeV.jpg"

["general"] = & gt;

string (98) "Một cậu bé được ban cho khả năng trở thành siêu anh hùng trưởng thành trong những lúc cần thiết chỉ với một từ phép thuật."

["release_date"] = & gt;

chuỗi (10)" 1553299200 "

[" thể loại "] = & gt;

string (23) "Hành động, Hài kịch, Giả tưởng"

}

// thêm hàng


Các bước để tạo tệp CSV trong PHP với các hàm gốc:

  1. Mở tệp bằng fopen sử dụng chế độ ghi
  2. Viết từng mảng trong một hàng CSV bằng fputcsv
  3. Đóng tệp bằng fclose
  

< p class = "biến mã thông báo"> $ lines

=

[

< p class = "mã thông báo đồng bằng">

[

'id'

,

'title'

,

< p class = "mã thông báo đồng bằng">

'poster'

,

'tổng quan'

,

'release_date'

,

'thể loại'

]

,


< p class = "dấu chấm câu mã thông báo"> [

181808

,

"Star Wars: The Last Jedi"

,

"https://image.tmdb.org/t/p/w500/kOVEVeg59E0wsnXmF9nrh6OmWII.jpg"

,

"Rey phát triển khả năng mới được khám phá của mình với sự hướng dẫn của Luke Skywalker, người không khỏi lo lắng trước sức mạnh của cô ấy. quyền hạn. Trong khi đó, Quân kháng chiến chuẩn bị chiến đấu với Lệnh Đầu tiên. "

,

1513123200

,

"Phim tài liệu"

]

,

[

383498

,

" Deadpool 2 "

,

" https: //image.tmdb.org/t/p/w500/to0spRl1CMDvyUbOnbb4fTk3VAd.jpg"

,

< p class = "token string double-quote-string"> "Người lính đánh thuê Wisecracking Deadpool chiến đấu với tên ác nhân và mạnh mẽ Cable an d những kẻ xấu khác để cứu sống một cậu bé. "

,

1526346000

,

"Hành động, Hài, Phiêu lưu "

]

,

[

157336

,

" Interstellar "

,

" https: //image.tmdb.org/t/p/w500/gEU2QniE6E77NI6lCU6MxlNBvIx.jpg"

,

< p class = "token string double-quote-string"> "Biên niên sử giữa các vì sao ghi lại cuộc phiêu lưu của một nhóm nhà thám hiểm sử dụng newl y đã phát hiện ra lỗ sâu để vượt qua những giới hạn trong việc du hành không gian của con người và chinh phục những khoảng cách rộng lớn trong chuyến du hành giữa các vì sao. "

,

1415145600

,

"Phiêu lưu, Chính kịch, Khoa học viễn tưởng"

]

< / p>

]

;

$ path

=

'data / new-file.csv'

;

$ fp

=

fopen

(

$ đường dẫn

,

< / p>

'w'

)

;

foreach

(

$ lines

dưới dạng mã thông báo

$ row

)

< p class = "dấu chấm câu mã thông báo"> {

fputcsv

(

$ fp

,

$ row

)

;

}


< p class = "token-line">

fclose

(

$ fp

)

;


Dấu phân tách mặc định là dấu phẩy e>, enclosure , Escape eol khi sử dụng các hàm fgetcsv fputcsv .

Hãy nối các hàng vào cuối tệp hiện có:

  

$ lines

= < / p>

[

[

'id'

,

'tiêu đề'

,

'áp phích '

,

'tổng quan'

,

'release_date'

,

' thể loại '

]

,

[

181808

,

"Chiến tranh giữa các vì sao : Jedi Cuối cùng "

,

"https://image.tmdb.org/t/p/w500/kOVEVeg59E0wsnXmF9nrh6OmWII.jpg"

,

p>

"Rey phát triển những khả năng mới được khám phá của mình với sự hướng dẫn của Luke Skywalker, người bất an trước sức mạnh của sức mạnh của cô ấy. Trong khi đó, phe Kháng chiến đang chuẩn bị chiến đấu với Lệnh đầu tiên. "Token number"> 1513123200

,

"Phim tài liệu"

]

,

[

383498

,

< p class = "mã thông báo string double-quote-string"> "Deadpool 2"

,

"https: / / image. tmdb. org / t / p / w500 / to0spRl1 CMDvyUbOnbb4fTk3VAd

"Người lính đánh thuê Wisecracking Deadpool chiến đấu với Cable độc ​​ác và mạnh mẽ cùng những kẻ xấu khác để cứu mạng một cậu bé."

, < / p>

1526346000

,

" Hành động, Hài kịch, Phiêu lưu "

]

,

[

157336

,

"Interstellar"

,

" https://image.tmdb.org/t/p/w500/gEU2QniE6E77NI6lCU6MxlNBvIx.jpg "

,

" Biên niên sử giữa các vì sao ghi lại cuộc phiêu lưu của một nhóm nhà thám hiểm sử dụng một lỗ sâu mới được phát hiện để vượt qua những giới hạn trong việc du hành không gian của con người và chinh phục những khoảng cách rộng lớn trong chuyến du hành giữa các vì sao. "

,

1415145600

,

" Phiêu lưu, Chính kịch, Khoa học Viễn tưởng "

]


< / p>

]

;

$ path

=

< / p>

'data / new-file.csv'

;

$ fp

=

fopen

(

$ đường dẫn

,

'a'

)

;

foreach

(

$ row

như

$ row

)

{

fputcsv

(

$ fp

,

$ row

)

;

}

fclose

(

$ fp < / p>

)

;


Điều quan trọng là phải hiểu tham số mode được sử dụng trong hàm fopen :

  • r là hàm đọc -chế độ chỉ
  • w là chế độ chỉ ghi, bắt đầu từ đầu tệp (xóa tệp hiện có)
  • w + < / code> là một chế độ đọc / ghi, bắt đầu từ đầu fi le (xóa tệp hiện có)
  • a là chế độ chỉ ghi, bắt đầu từ cuối tệp (nối nội dung vào cuối tệp)
  • a + là chế độ đọc / ghi, bắt đầu ở cuối tệp (nối nội dung vào cuối tệp)

Sử dụng các chế độ < code> w , w + , a , a + sẽ tạo tệp CSV nếu nó chưa tồn tại.

Phương pháp đọc và viết trước đây này hoàn toàn ổn, nhưng một số thư viện hiện đại có thể giúp cuộc sống của chúng ta dễ dàng hơn và mã của chúng ta dễ đọc hơn một chút.

Hướng dẫn này sử dụng league / csv library, cung cấp một API thao tác CSV rõ ràng và đơn giản.

Chúng tôi cũng có thể lưu ý rằng thư viện box / spout tuyệt vời, rất mạnh, cung cấp hỗ trợ cho các định dạng khác và có thể được sử dụng để đọc và ghi các tệp Excel bằng PHP .

Hãy cài đặt thư viện league / csv bằng cách sử dụng trình quản lý gói trình soạn nhạc:

  

trình soạn nhạc yêu cầu giải đấu / csv


Đọc các hàng CSV từ tệp bằng Reader :

  

sử dụng

Giải đấu

\

Csv

\

Trình đọc

;

$ path

=

'data / movies-100.csv'

;

$ csv

=

Reader

::

createFromPath

< p class = "dấu chấm câu"> (

$ path

,

'r'

)

;

$ csv

- & gt;

setHeaderOffset

(

0

)

;

< p class = "mã thông báo đồng bằng">

$ header

=

$ csv

- & gt;

getHeader

(

)

;

var_dump

(

$ header

)

;


$ row

=

$ csv

< p class = "mã thông báo toán tử "> - & gt;

getRecords

(

)

;

foreach

(

$ lines

dưới dạng

$ row

)

{

var_dump

(

$ row

< p class = "dấu chấm câu mã thông báo">)

;

}


Khi sử dụng cấu hình setHeaderOffset , chúng ta có thể thấy một sự khác biệt nhỏ nhưng thú vị so với việc sử dụng hàm PHP gốc. Trình đọc league / csv tải các hàng dưới dạng mảng liên kết (đối tượng JSON). Nó giúp thao tác dữ liệu dễ dàng hơn vì chúng ta có thể xử lý độc lập với từng hàng.

  

mảng (6) {

[" id "] = & gt;

string (3)" 807 "< / p>

["title"] = & gt;

string (5) "Se7en"

["poster"] = & gt;

string (63) "https://image.tmdb.org/t/p/w500/6yoghtyTpznpBik8EngEmJskVUO.jpg"

["tổng quan"] = & gt;

string (390)" Hai thám tử giết người đang truy lùng ráo riết một kẻ giết người hàng loạt có tội ác dựa trên 'bảy tội lỗi chết người' trong bộ phim đen tối và ám ảnh này đưa người xem từ phần còn lại bị tra tấn của một nạn nhân đến tiếp theo. Det. Sommerset dày dạn kinh nghiệm nghiên cứu từng tội lỗi để cố gắng đi sâu vào tâm trí của kẻ giết người, trong khi đối tác mới của anh ta, Mills, chế giễu nỗ lực của anh ta để làm sáng tỏ vụ án. "


< p class = "token-line">

["release_date"] = & gt;

string (9) "811731600"

["thể loại"] = & gt;

string (24) "Tội phạm, Bí ẩn, Kinh dị"

< br />

}


Viết các hàng CSV vào một tệp bằng Writer :

  

< p class = "từ khóa mã thông báo"> sử dụng

Giải đấu

\

Csv

\

Người viết

;

$ row

=

[

[

'id'

,

'title'

,

'poster'

,

'tổng quan'

,

< / p>

'release_date'

,

'styles'

]

,

[

181808

,

< p class = "token string double-quote-string"> "Chiến tranh giữa các vì sao: Jedi cuối cùng"

,

" https://image.tmdb.org/t/p/w500/kOVEVeg59E0wsnXmF9nrh6OmWII.jpg "

,

"Rey phát triển những khả năng mới được khám phá của mình với sự hướng dẫn của Luke Skywalker, người không khỏi lo lắng trước sức mạnh của sức mạnh. Trong khi đó, Quân kháng chiến chuẩn bị chiến đấu với Lệnh Đầu tiên. "

,

1513123200

,

"Phim tài liệu"

]

,

[

383498

,

" Deadpool 2 "

,

" https: //image.tmdb.org/t/p/w500/to0spRl1CMDvyUbOnbb4fTk3VAd.jpg"

,

< p class = "token string double-quote-string"> "Người lính đánh thuê Wisecracking Deadpool chiến đấu với tên ác nhân và mạnh mẽ Cable an d những kẻ xấu khác để cứu sống một cậu bé. "

,

1526346000

,

"Hành động, Hài, Phiêu lưu "

]

,

[

157336

,

" Interstellar "

,

"https://image.tmdb.org/t/p/w500/gEU2QniE6E77NI6lCU6MxlNBvIx. jpg "

,

" Biên niên sử giữa các vì sao cuộc phiêu lưu của một nhóm nhà thám hiểm tận dụng một lỗ sâu mới được phát hiện để vượt qua những giới hạn trong việc du hành không gian của con người và chinh phục những khoảng cách rộng lớn trong chuyến du hành giữa các vì sao. "

, < / p>

1415145600

,

"Phiêu lưu, Chính kịch, Khoa học viễn tưởng "

]

]

;


$ path

=

'data / new-file2.csv'

;

$ csv

=

Writer

::

createFromPath

(

$ đường dẫn

,

'w'

)

;

< p class = "mã thông báo đồng bằng">

$ csv

- & gt;

insertAl l

(

$ hàng

)

;


Đoạn mã này là một đoạn mã thú vị để xuất cơ sở dữ liệu của bạn trong tệp CSV; trong trường hợp này, bạn cần cung cấp tệp bằng cách đọc các hàng từ cơ sở dữ liệu của mình bằng một số truy vấn.

Hãy nhớ rằng khi chúng tôi sử dụng createFromPath với chế độ w , chúng tôi xóa toàn bộ nội dung tệp nếu nó đã tồn tại.

Đôi khi, chúng tôi cần thêm các dòng vào cuối tệp hiện có mà không xóa nội dung hiện tại của nó.

Trong trường hợp này, chúng tôi mở tệp bằng cách sử dụng giá trị a + cho tham số open_mode :

  

sử dụng

< / p>

Giải đấu

\

Csv

\

Người viết

;

$ appendRows

=

< p class = "dấu chấm câu mã thông báo"> [

[

324857

,

< p class = "token trơn">

"Spider-Man: Into the Spider-Verse"

,

"https://image.tmdb.org/t/p/w500/iiZZdoQBEYBv6id8su7ImL0oCbD .jpg "

,

" Dặm Morales đang đan xen cuộc sống của mình giữa việc là một học sinh trung học và trở thành một người nhện. Khi Wilson 'Kingpin' Fisk sử dụng một máy siêu va chạm, những người khác từ khắp Spider-Verse sẽ được chuyển đến không gian này. "

,

1544140800

,

" Hành động, Phiêu lưu, Hoạt hình, Khoa học viễn tưởng, Hài "

]

,

[

456740

,

"Hellboy"

< p class = "dấu chấm câu mã thông báo">,

"https://image.tmdb.org /t/p/w500/bk8LyaMqUtaQ9hUShuvFznQYQKR.jpg"

,

"Hellboy đến Anh, nơi anh ta phải đánh bại Nimue, phối ngẫu của Merlin và Nữ hoàng máu. Nhưng trận chiến của họ sẽ dẫn đến ngày tận thế, một định mệnh mà anh ta cố gắng một cách tuyệt vọng quay lưng lại. "

,

1554944400

,

"Ảo tưởng, Hành động"

]

]

;

$ path

=

'data / new-file2.csv'

;

$ csv

=

< / p>

Writer

::

createFromPath

(

$ đường dẫn

,

'a +'

)

;

$ csv

- & gt;

insertAll

(

$ appendRows

)

;


Bây giờ, chúng ta sẽ khám phá các thao tác nâng cao nhưng thường được sử dụng trên CSV.

  

sử dụng

Giải đấu

\

Csv

\

Trình đọc

;

< br />

$ csv

=

Trình đọc

::

createFromPath

(

$ đường dẫn

,

'r'

)

;

$ csv

- & gt;

setHeaderOffset

(

0

)

;

var_dump

(

$ csv

- & gt;

đếm

(

) < / p>

)

;


  

sử dụng

Giải đấu

\

Csv

\

Trình đọc

;

$ csv

=

Reader

::

createFromPath

(

$ đường dẫn

,

'r'

)

;

$ csv

- & gt;

setHeaderOffset

(

0

)

;

var_dump

(

$ csv

- & gt;

getHeader

(

)

)

;


< / pre>
 

mảng (6) {< / p>

[0] = & gt;


< p class = "token-line">

string (2) "id"

[1] = & gt;

string (5) "tiêu đề"

[2] = & gt; />

string (6) "bài viết"

[3] = & gt;

chuỗi (8) "tổng quan"

[4] = & gt;

[5] = & gt;

string (6) "thể loại"

}


 

sử dụng

League

\

Csv

\

Người đọc

;

$ csv

=

Trình đọc

: :

createFromPath

(

$ path

,

'r'

)

;

)

$ csv

- & gt;

setHeaderOffset

(

0

)

;

var_dump

(

$ csv

- & gt;

fetchOne

(

10

)

) < / p>

;


   

= "0"> mảng (6) {

[" id "] = & gt;

string (3)" 920 "

[" title "= & gt;

string (4) "Ô tô"

< p class = "token-trơn"> ["posts"] = & gt;

string (63) "https: // image. tmdb -line">

["tổng quan"] = & gt;

string (386) "Lightning McQueen, một tân binh đua xe hotshot được điều khiển để đạt được thành công, phát hiện ra rằng cuộc sống là về hành trình chứ không phải về đích , khi anh ta bất ngờ bị lạc vào thị trấn Radiator Springs đang buồn ngủ trên Đường 66. Trên đường đến Giải vô địch Piston Cup lớn ở California trên khắp đất nước để so tài với hai tay vợt chuyên nghiệp dày dạn kinh nghiệm, McQueen làm quen với những nhân vật khác thường của thị trấn. "

[" release_date "] = & gt;

string (10)" 1149728400 "

["styles"] = & gt;

string (36) "Hoạt hình, Phiêu lưu, Hài kịch, Gia đình" p>

}


Chúng tôi tìm nạp 3 hàng bắt đầu từ Hàng thứ 10:

  

sử dụng

Giải đấu

\ < / p>

Csv

\

Trình đọc

;

sử dụng

Giải đấu

\

Csv

\

Câu lệnh < / p>

;

$ csv

=

Reader

::

createFromPath

< p class = "dấu chấm câu"> (

$ path

,

'r'

)

;

$ csv

- & gt;

setHeaderOffset

(

0

)

;

< p class = "mã thông báo đồng bằng">

$ stmt

=

Câu lệnh

::

tạo

(

)

< / p>

- & gt;

bù đắp

(

10

)

- & gt;

giới hạn

(

3

)

;

< br />

$ bản ghi

=

$ stmt

- & gt;

process

(< / p>

$ csv

)

;

foreach

(

$ bản ghi

dưới dạng

$ row

)

{

var_dump

(

$ row

)

;

}


Chúng tôi chỉ tìm nạp những phim có tiêu đề là" Deadpool ":

  

sử dụng

Giải đấu

\ < / p>

Csv

\

Trình đọc

;

sử dụng

Giải đấu

\

Csv

\

Câu lệnh < / p>

;

$ csv

=

Trình đọc

::

createFromPath

(

$ path

,

'r'

)

;

$ csv

- & gt;

setHeaderOffset

(

0

)

;

$ stmt

=

Câu lệnh

: :

tạo

(

)

- & gt;

trong đó

(

chức năng

< p class = "dấu chấm câu mã thông báo"> (

$ row

)

{

trả về

strpos

(

$ row

[

'tiêu đề'

]

,

'Deadpool'

)

! ==

false

< p class = "dấu chấm câu mã thông báo">;

}

)

;

< p class = "mã thông báo đồng bằng">

$ bản ghi

=

$ stmt

- & gt;

quy trình

(

$ csv

)

;

foreach

(

$ bản ghi

dưới dạng

$ row

)

{

var_dump

(

$ row

)

;

< / p>

}


  

mảng (6) {

[ "id"] = & gt;

chuỗi (6) "383498"

["title"] = & gt;

< br />

string (10) "Deadpool 2"

["poster"] = & gt;

string (63)" https://image.tmdb.org/t/p/w500/to0spRl1CMDvyUbOnbb4fTk3VAd.jpg "

["tổng quan"] = & gt;

chuỗi (108) "Deadpool lính đánh thuê khôn ngoan chiến đấu với Cable độc ​​ác và mạnh mẽ cùng những kẻ xấu khác để cứu mạng một cậu bé."

["release_date"] = & gt;

string (10) "1526346000 "

[" thể loại "] = & gt;

string (25) "Hành động, Hài kịch, Phiêu lưu"

}

mảng (6) {

["id"] = & gt;

< br />

string (6) "293660"

[" title "] = & gt;

string (8)" Deadpool "

[" poster "] = & gt; < / p>

string (63) "https://image.tmdb.org/t/p/w500 /yGSxMiF0cYuAiyuve5DA6bnWEOI.jpg "

[" Overview "] = & gt;

string (348) "Deadpool kể câu chuyện nguồn gốc của cựu đặc nhiệm trở thành lính đánh thuê Wade Wilson, người sau khi bị một thí nghiệm giả mạo khiến anh ta có khả năng chữa bệnh cấp tốc, sử dụng Deadpoo bản ngã thay đổi l. Được trang bị khả năng mới và khiếu hài hước đen tối, Deadpool săn lùng kẻ suýt hủy diệt cuộc đời anh. "

["release_date"] = & gt;

chuỗi (10) "1454976000"

["Thể loại"] = & gt;

string (25) "Hành động, Phiêu lưu, Hài"

}


Chúng tôi tìm nạp năm bộ phim đầu tiên được sắp xếp theo tiêu đề chữ cái tăng dần :

  

sử dụng

Giải đấu

\

Csv

\

Đọc er

;

sử dụng

Giải đấu

\

Csv

\

Câu lệnh

;

$ csv

=

Trình đọc

::

createFromPath

(

$ đường dẫn

,

'r'

)

;

$ csv

- & gt;

setHeaderOffset

(

0

)

;

$ stmt

=

Câu lệnh

::

tạo

(

)

< p class = "mã thông báo đồng bằng">

- & gt;

orderBy

(

chức năng

(

$ row1

,

$ row2

)

{

trả về

strcmp

(

$ row1

[

'title'

]

,

$ row2

[

'title'

]

)

;

}

)

- & gt;

giới hạn

(

5

)

;

< p class = "mã thông báo đồng bằng">

$ bản ghi

=

$ stmt

- & gt;

quy trình

(

$ csv

)

;

foreach

(

$ record

dưới dạng

$ row

)

{

var_dump

(

$ row

)

;

}


Phân tích cú pháp tệp CSV và chuyển đổi các hàng của nó thành chuỗi JSON là một thao tác khá đơn giản:

  

sử dụng

Giải đấu

< p class = "dấu chấm câu gói mã thông báo"> \

Csv

\

Trình đọc

;

$ csv

=

Trình đọc

: :

createFromPath

(

$ đường dẫn

,

'r'

)

;


< p class = "mã thông báo đồng bằng">

$ csv

- & gt;

setHeaderOffset

(

0

)

;


$ data

=

$ csv

- & gt;

jsonSerialize

(

)

;


$ jsonString

=

json_encode

(

$ data

,

JSON_PRETTY_PRINT

)

; < / p>

Việc chuyển đổi định dạng JSON thành tệp CSV đòi hỏi nhiều công việc hơn một chút; trước tiên, chúng tôi cần trích xuất các khóa từ một trong các đối tượng JSON để sử dụng chúng làm tiêu đề của tệp CSV của chúng tôi:

  

sử dụng

Giải đấu

\

Csv

\ < / p>

Writer

;


$ đường dẫn

=

'data / movies-flat-10.json'

;


$ jsonString

=

< p class = "hàm mã thông báo"> tệp_get_contents

(

$ đường dẫn

)

;


$ jsonObjects

=

json_decode

(

$ jsonString

,

đúng

)

;



$ headers

=

array_keys

(

hiện tại

< p class = "dấu chấm câu"> (

$ jsonObjects

)

)

;



$ hàng

=

[

]

;

foreach

(

$ jsonObjects

as

$ jsonObject

)

{

$ lines

[

]

=

array_values ​​

(

$ jsonObject

)

;

}



$ path

= < / p>

'data / new-file2.csv'

;

$ csv

=

Writer

::

createFromPath

(

$ đường dẫn

,

'w'

)

;

< p class = "mã thông báo đồng bằng">

$ csv

- & gt;

insertOne

(

$ headers

)

;

$ csv

- & gt;

insertAll

(

$ lines

)

;


Nếu bạn muốn tiến xa hơn về thao tác với tệp JSON, bạn có thể xem bài đăng chuyên dụng này về đọc và ghi tệp JSON bằng PHP .

Mẹo để phân tích cú pháp các tệp CSV lớn bằng cách sử dụng bộ nhớ thấp là không bao giờ tải tất cả dữ liệu trong bộ nhớ.

May mắn thay, cả phương pháp đọc gốc và league / csv đều cho phép chúng tôi lặp lại và truyền trực tuyến nội dung.

Hãy lấy ví dụ về một tệp chứa 1 triệu các dòng; tệp này có dung lượng gần 400MB.

  

- rw-r - r-- 1 nico nico 393M có thể 13 12:38 data / movies-1000000.csv


Hãy tải tất cả nội dung của nó:

      

sử dụng

Symfony

\

Thành phần

\

Đồng hồ bấm giờ

\

Đồng hồ bấm giờ

;

sử dụng

Giải đấu

\

Csv

\

Trình đọc

;

$ part

=

'read_csv_file'

;

$ this

- & gt;

đồng hồ bấm giờ

- & gt;

bắt đầu

(

$ section

)

;

$ path

=

'data / movies-1000000.csv'

;

$ csv

=

Trình đọc < / p>

::

createFromPath

(

$ đường dẫn

,

'r'

)

;

$ csv

- & gt;

setHeaderOffset

(

< p class = "số mã thông báo"> 0

)

;

$ row

=

$ csv

- & gt;

getRecords

(

< p class = "dấu chấm câu mã thông báo">)

;

foreach

(

$ lines

như

$ row

)

{


}

$ this

- & gt;

đồng hồ bấm giờ

- & gt;

dừng

(

$ section

)

; "mã thông báo-line">

$ output

- & gt;

write

(

"Tôi đã đọc"

.

$ csv

- & gt;

đếm

(

)

.

" các hàng từ Tệp CSV "

.

$ path

)

;


< lớp p = "biến mã thông báo"> $ đầu ra

- & gt;> (

(

string

)

$ this < / p>

- & gt;

đồng hồ bấm giờ

- & gt;

< p class = "hàm mã thông báo"> getEvent

(

$ section

)

)

;


Và đây là kết quả:

  

1000000.csv

default / read_csv_file: 6,00 MiB - 26699 mili giây


Chúng tôi đã tải các dòng CSV của mình trong 26 giây chỉ sử dụng 6MB bộ nhớ! 🤯

Bằng cách phát trực tuyến đúng cách đọc dữ liệu và xử lý bạn muốn áp dụng, bạn có thể giữ mức sử dụng bộ nhớ rất thấp, trình phân tích cú pháp PHP CSV rất hiệu quả, đặc biệt có lợi khi nhập tệp CSV lớn vào kho lưu trữ GitHub cơ sở dữ liệu .

Nó được đóng gói như một dự án Symfony đơn giản, với một tập hợp các lệnh, nó cũng đi kèm với hình ảnh Docker. 🐋