Cara Menangani CSV dengan PHP: Baca Tulis, Impor Ekspor dengan Database

oleh Vincy. Terakhir diubah pada 10 September 2020.

CSV adalah salah satu format file yang familiar dan digunakan secara luas oleh programmer untuk menangani data. Kesederhanaan format dan bentuk yang dapat dibaca manusia membuatnya sangat populer. CSV adalah singkatan dari Comma-Separated Values. Di hari-hari sebelumnya, pembatasnya hanya koma (,) dan begitulah namanya CSV. Saat ini, file CSV juga menggunakan data baris yang dibatasi tab.

Untuk menangani CSV dengan PHP, kita harus menyadari bahwa ada dukungan yang sangat baik yang dibangun dengan inti PHP. Pengetahuan tentang library dan fungsi bawaan tersebut akan berguna dalam menangani file CSV.

CSV PHP

Apa yang ada di dalam?

Pada artikel ini, kita akan melihat tentang cara menangani CSV menggunakan PHP dengan contoh yang sesuai.

  1. Format file CSV dan tipe MIME
  2. Bagaimana cara mengubah PHP Array ke CSV?
  3. Validasi data file CSV
  4. Bagaimana cara mengimpor file CSV besar?
  5. Bagaimana cara membagi file CSV besar dan memproses menggunakan PHP?
  6. Bagaimana cara membaca file CSV yang disandikan dengan karakter khusus?
  7. Konversi file CSV ke tabel HTML menggunakan PHP
  8. Proses file CSV dengan nilai data koma menggunakan PHP
  9. Ekspor catatan basis data ke CSV dengan cara yang umum
  10. Bagaimana cara mengekspor CSV menggunakan fputcsv?
  11. Unduh sebagai File CSV melalui browser menggunakan Content-Type
  12. Baca CSV menggunakan fungsi bawaan PHP

Ini akan menjadi tutorial komprehensif yang membahas semua aspek penanganan file CSV dengan PHP. Ketika Anda perlu menangani data terstruktur maka menggunakan data JSON dan menanganinya dengan PHP akan menjadi pilihan yang lebih baik.

Format file CSV dan tipe MIME

Mari kita mulai dengan format CSV dan konvensi tipe MIME. Format umum dan tipe MIME untuk file CSV dibahas di sini dengan referensi dokumentasi RFC 4180.

Definisi Format CSV

Ini adalah definisi umum untuk format CSV yang valid.

  • Setiap baris dipisahkan atau dibatasi oleh line break (CRLF). Sebagai contoh:
            col_11,col_12,col_13 CRLF
            col_21,col_22,col_23 CRLF
  • Baris terakhir file CSV mungkin atau mungkin tidak memiliki jeda baris. Sebagai contoh:
            col_11,col_12,col_13 CRLF
            col_21,col_22,col_23
  • Data CSV mungkin berisi baris header opsional di awal dalam format yang sama dengan baris lainnya. Sebagai contoh:
           column_name1,column_name2,column_name3 CRLF
           col_11,col_12,col_13 CRLF
           col_21,col_22,col_23
  • Jumlah nama bidang yang dipisahkan koma di header harus sama dengan jumlah nilai yang dipisahkan koma di baris lainnya dalam file CSV. Sebagai contoh:
           column_name1,column_name2,column_name3 CRLF
           col_11,col_12,col_13 CRLF
           col_21,col_22,col_23
  • Setiap bidang baris dapat diapit oleh Double Quotes(“). Tapi itu opsional. Bidang yang tidak diapit oleh tanda kutip ganda tidak boleh berisi karakter khusus tanda kutip ganda sebagai bagian darinya. Sebagai contoh:
           "col_11","col_12","col_13" CRLF
           col_21,col_22,col_23
  • Kolom yang berisi tanda kutip ganda (“), Line Break (CRLF) dan Koma harus diapit dengan tanda kutip ganda. Sebagai contoh:
           "col_""11","col_"CRLF
           12",col_13 CRLF
           col_21,col_22,col_23
  • Kolom yang berisi tanda kutip ganda (“), Line Break (CRLF) dan Koma harus diapit dengan tanda kutip ganda. Sebagai contoh:
           "col_11","col_"CRLF
           12",col_13 CRLF
           col_21,col_22,col_23
  • Jika Bidang yang diapit oleh tanda kutip ganda (“) berisi karakter tanda kutip ganda maka tanda kutip ganda di dalam bidang harus didahului dengan tanda kutip ganda lainnya sebagai urutan escape. Sebagai contoh:
           "col_""11","col_12",col_13 CRLF
           col_21,col_22,col_23

Tipe MIME eksklusif standar teks/csv terdaftar oleh RFC 4180. Sebelum itu, berbagai tipe MIME seperti tipe “teks/tab-separated-values” digunakan oleh berbagai program atau OS untuk format CSV.

Jika Anda ingin mempelajari lebih lanjut tentang format CSV dan tipe MIME, dokumen RFC 4180 memiliki informasi lebih lanjut.

Bagaimana cara mengubah PHP Array ke CSV?

Ada banyak cara yang mungkin dalam PHP untuk mengubah data array menjadi format CSV. PHP berisi fungsi bawaan seperti fputcsv() untuk melakukan konversi ini.

Kode berikut menggunakan fungsi PHP kustom str_putcsv() untuk mendapatkan data array dan memasukkannya ke dalam file target seperti yang ditentukan. Fungsi kustom ini menggunakan fputcsv() bawaan PHP pada setiap iterasi array.

<?php

function arrayToCSV($inputArray)
{
    $csvFieldRow = array();
    foreach ($inputArray as $CSBRow) {
        $csvFieldRow[] = str_putcsv($CSBRow);
    }
    $csvData = implode("n", $csvFieldRow);
    return $csvData;
}

function str_putcsv($input, $delimiter=",", $enclosure=""")
{
    // Open a memory "file" for read/write
    $fp = fopen('php://temp', 'r+');
    // Write the array to the target file using fputcsv()
    fputcsv($fp, $input, $delimiter, $enclosure);
    // Rewind the file
    rewind($fp);
    // File Read
    $data = fread($fp, 1048576);
    fclose($fp);
    // Ad line break and return the data
    return rtrim($data, "n");
}

$inputArray = array(
    array("First Name", "Last Name", "Identification Number"),
    array("Kim","Thomas","8001"),
    array("Jeffery","Robert","8021"),
    array("Helan","Albert","8705")
);
print "<PRE>";
print $CSVData = arrayToCSV($inputArray);
?>

Saya telah mencetak data keluaran yang dikonversi ke browser. Keluaran CSV adalah,

Output Konversi Array PHP ke CSV

Validasi data file CSV

Umumnya, validasi pada file CSV akan dilakukan untuk memeriksa apakah file tersebut memiliki definisi format standar. Kondisi berikut harus diterapkan ke file input CSV untuk memeriksa apakah itu valid atau tidak.

  • Untuk memeriksa apakah file input dengan ekstensi file CSV yang tepat dan dalam batas ukuran.
  • Untuk memeriksa apakah jumlah nilai yang dipisahkan koma di semua baris sama.
  • Untuk memeriksa apakah data baris berisi karakter khusus yang diizinkan dengan urutan escape yang tepat.

Selain itu, Anda dapat menambahkan validasi tambahan berdasarkan kebutuhan aplikasi Anda. Sebagai contoh,

  • Untuk memeriksa apakah bidang baris CSV berisi data dalam format yang diharapkan. Misalnya, jika bidang nomor_telepon berisi data numerik dengan karakter yang diizinkan.
  • Untuk memeriksa apakah bidang berada dalam urutan yang benar sesuai kebutuhan aplikasi Anda.
  • Untuk memeriksa apakah bidang wajib tidak kosong.

Kode PHP ini menunjukkan cara menerapkan validasi CSV pada file yang diunggah. Dalam tutorial sebelumnya, kita telah melihat cara memvalidasi file gambar yang diunggah di PHP.

Pada script ini, validasi dilakukan untuk memeriksa ekstensi file CSV, size. Setelah selesai, kita perlu menangani CSV dengan PHP untuk memeriksa jumlah bidang di semua baris CSV.

<?php
if (isset($_POST["upload"])) {
    
    // Get file extension
    $file_extension = pathinfo($_FILES["file-input"]["name"], PATHINFO_EXTENSION);
    // Validate file input to check if is not empty
    if (! file_exists($_FILES["file-input"]["tmp_name"])) {
        $response = array(
            "type" => "error",
            "message" => "File input should not be empty."
        );
    } // Validate file input to check if is with valid extension
    else if ($file_extension != "csv") {
            $response = array(
                "type" => "error",
                "message" => "Invalid CSV: File must have .csv extension."
            );
            echo $result;
        } // Validate file size
    else if (($_FILES["file-input"]["size"] > 2000000)) {
            $response = array(
                "type" => "error",
                "message" => "Invalid CSV: File size is too large."
            );
        } // Validate if all the records have same number of fields
    else {
        $lengthArray = array();
        
        $row = 1;
        if (($fp = fopen($_FILES["file-input"]["tmp_name"], "r")) !== FALSE) {
            while (($data = fgetcsv($fp, 1000, ",")) !== FALSE) {
                $lengthArray[] = count($data);
                $row ++;
            }
            fclose($fp);
        }
            
        $lengthArray = array_unique($lengthArray);
        
        if (count($lengthArray) == 1) {
            $response = array(
                "type" => "success",
                "message" => "File Validation Success."
            );
        } else {
            $response = array(
                "type" => "error",
                "message" => "Invalid CSV: Count mismatch."
            );
        }
    }
}
?>

Skrip Validasi CSV

<form id="frm-upload" action="" method="post"
    enctype="multipart/form-data">
    <div class="form-row">
        <div>Choose file:</div>
        <div>
            <input type="file" class="file-input" name="file-input">
        </div>
    </div>

    <div class="button-row">
        <input type="submit" id="btn-submit" name="upload"
            value="Upload">
    </div>
</form>
<?php if(!empty($response)) { ?>
<div class="response <?php echo $response["type"]; ?>
    ">
    <?php echo $response["message"]; ?>
</div>
<?php }?>

Jika proses validasi tidak mengembalikan TRUE maka pesan kesalahan akan ditampilkan kepada pengguna seperti yang ditunjukkan pada tangkapan layar di bawah ini.

Skrip Validasi CSV

Bagaimana cara mengimpor file CSV besar?

Mengimpor file CSV besar menggunakan fungsi penanganan file PHP mungkin bukan cara yang efisien untuk melakukannya. Jika waktu eksekusi melebihi batas max_execution_time yang dikonfigurasi, maka impor tidak akan selesai.

Saat memproses impor file CSV besar, ada beberapa cara seperti eksekusi baris perintah, eksekusi kueri, dan lainnya. Di bagian ini, saya akan menunjukkan cara mengimpor file CSV besar menggunakan pernyataan MySQL LOAD DATA. Jika Anda dapat LOAD ini, maka ini adalah pilihan yang lebih baik karena memberikan kinerja terbaik.

<?php 
$conn = mysqli_connect("localhost", "root", "test", "blog_samples");
$query = "LOAD DATA INFILE 'input.csv' INTO TABLE tbl_student_master IGNORE 1 LINES";
if (!mysqli_query($conn, $query)) {
    printf("Errormessage: %sn", mysqli_error($conn));
}
?>

Sebelum menjalankan program ini, pastikan Anda telah membuat database dan tabel target yang diperlukan. Impor skrip SQL berikut untuk memproses impor dengan menjalankan contoh ini di lingkungan Anda.

--
-- Table structure for table `tbl_student_master`
--

CREATE TABLE `tbl_student_master` (
  `unique_id` int(11) NOT NULL,
  `first_name` varchar(55) NOT NULL,
  `last_name` varchar(55) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Indexes for table `tbl_student_master`
--
ALTER TABLE `tbl_student_master`
  ADD PRIMARY KEY (`unique_id`);
COMMIT;

catatan: jika –file-aman-priv opsi diaktifkan di konfigurasi MySQL Anda, maka program ini hanya akan berfungsi jika file CSV input terletak di direktori seperti yang ditentukan dalam pengaturan –secure-file-priv.

Bagaimana cara membagi file CSV besar dan memproses menggunakan PHP?

Dalam tutorial sebelumnya, kita telah melihat cara membagi file excel menjadi beberapa file. Pemisahan akan diperlukan saat menangani file Excel atau CSV yang besar.

Di bagian ini, saya menunjukkan cara membagi file CSV menjadi beberapa file. Saya telah menggunakan PHP RegexIterator dan SplFileObject kelas untuk menerapkan pemisahan pada file CSV input.

RegexIterator adalah kelas PHP bawaan yang mewarisi FilterPewaris kelas untuk memfilter berdasarkan ekspresi reguler. Ia menerima data input, pola regex dan mode operasi dan lebih banyak parameter.

Kelas SplFileObject yang memberikan antarmuka berorientasi objek untuk file. Dengan menggunakan ini, objek target dibuat untuk menempatkan catatan yang dipisah ke dalam target.

<?php
$rowAry = new RegexIterator(new SplFileObject('input.csv'), '/n/', RegexIterator::SPLIT);
$header = "";
foreach ($rowAry as $i => $row) {
    // IF the input CSV has header (column_name) row
    if ($i == 0) {
        $header = $row[0];
    } else {
        $filename = "output_$i.csv";
        $myfile = fopen($filename, "w");
        $target = new SplFileObject($filename, 'w');
        if (! empty($header)) {
            $target->fwrite($header . "n");
        }
        $target->fwrite($row[0]);
    }
}
?>

Bagaimana cara membaca file CSV yang disandikan dengan karakter khusus?

Jika CSV masukan berisi data non-bahasa Inggris, penguraian file CSV akan berperilaku seperti yang diharapkan. Entah itu akan mengembalikan kesalahan seperti “Argumen tidak valid” atau itu akan menampilkan karakter campur aduk sebagai hasil dari operasi membaca CSV.

Masalah ini dapat diatasi dengan menyetel rangkaian karakter saat membaca CSV. Dalam skrip di bawah ini, fungsi iconv PHP digunakan untuk mengatur charset input dan output untuk membaca data aktual dari CSV.

<?php
function convert( $str ) {
    return iconv( "UTF-8", "UTF-8", $str );
}

if (($fp = fopen('input.csv', "r")) !== FALSE) {
    while (($row = fgetcsv($fp)) !== false) {
        $rowArray = array_map( "convert", $row );
        $rowCSV[] = implode(",", $rowArray);
    }
    fclose($fp);
    $csvData = implode("n", $rowCSV);
    print $csvData;
}
?>

Konversi file CSV ke tabel HTML menggunakan PHP

Untuk mengonversi file CSV ke dalam format HTML, markup baris tabel harus dibuat selama iterasi baris demi baris CSV.

Dengan mengacu pada contoh sebelumnya yang telah kita lihat di atas, membuat HTML untuk data CSV adalah pekerjaan yang mudah.

Kode di bawah ini menunjukkan cara membuat markup tabel HTML dan menampilkan data CSV ke dalamnya. Ini mengulangi file CSV yang diunggah melalui formulir HTML dan diurai untuk mendapatkan data baris.

Data baris yang diurai dimasukkan ke dalam kolom tabel dengan menggunakan pernyataan gema PHP. Header tabel dapat diidentifikasi dengan menggunakan indeks iterasi loop. Oleh karena itu, data header dibedakan dari baris lain menggunakan CSS.

<?php
if(!empty(isset($_POST["upload"]))) {
    if (($fp = fopen($_FILES["file-input"]["tmp_name"], "r")) !== FALSE) {
    ?>
<table class="tutorial-table" width="100%" border="1" cellspacing="0">
<?php
    $i = 0;
    while (($row = fgetcsv($fp)) !== false) {
        $class ="";
        if($i==0) {
           $class = "header";
        }
        ?>
    <tr>
            <td class="<?php echo $class; ?>"><?php echo $row[0]; ?></td>
            <td class="<?php echo $class; ?>"><?php echo $row[1]; ?></td>
            <td class="<?php echo $class; ?>"><?php echo $row[2]; ?></td>
        </tr>
    <?php
        $i ++;
    }
    fclose($fp);
    ?>
    </table>
<?php
    $response = array("type" => "success", "message" => "CSV is converted to HTML successfully");
    } else {
        $response = array("type" => "error", "message" => "Unable to process CSV");
    }
}
?>
</div>
<?php if(!empty($response)) { ?>
<div class="response <?php echo $response["type"]; ?>
    ">
    <?php echo $response["message"]; ?>
</div>
<?php } ?>

Keluaran Konversi CSV ke HTML

Tangkapan layar berikut menunjukkan output dari tabel HTML yang dihasilkan dengan mengurai file CSV yang diunggah melalui formulir.

Konversi CSV Ke HTML

Proses file CSV dengan nilai data koma menggunakan PHP

Sesuai spesifikasi CSV “Bidang yang berisi jeda baris (CRLF), tanda kutip ganda, dan koma harus diapit oleh tanda kutip ganda.

Jadi, saya telah membuat input.csv yang berisi nilai dengan karakter Comma(). Isi file akan seperti yang ditunjukkan di bawah ini.

"Identification Number","First Name","Last Name"
8001,"Kim,",Thomas
8021,"Jeff,ery",Robert
8705,Helan,Albert

Pada data CSV di atas, Anda dapat melihat bahwa nilai yang mengandung koma diapit oleh tanda kutip ganda(“)

Seperti contoh di atas, kita akan menggunakan fungsi PHP fgetcsv() untuk membaca dan memproses data file CSV yang mengandung nilai koma.

Sesuai sintaks fungsi fgetcsv(), ia menerima input karakter untuk menentukan pembatas bidang, penutup bidang, dan lainnya.

Karena enklosur default adalah karakter tanda kutip ganda, kita tidak perlu menentukan parameter tersebut saat menjalankan fgetcsv().

Berikan input CSV yang memiliki nilai dengan koma ke skrip konversi CSV ke HTML yang telah kita lihat di bagian di atas. Ini akan menampilkan data CSV dengan Koma dalam format HTML seperti yang ditunjukkan di bawah ini.

Proses CSV yang Mengandung Nilai dengan Koma

Ekspor catatan basis data ke CSV dengan cara yang umum

Saat mengekspor database, file cadangan dapat dibuat dalam berbagai format SQL, CSV, Excel. Dalam tutorial sebelumnya, kita telah melihat cara mengekspor database ke file CSV.

Untuk melakukan backup database ini secara terprogram, kita perlu mengeksekusi pernyataan MySQL yang sesuai untuk mengekstrak struktur dan data.

Dengan melakukan ini, cadangan akan siap dengan pernyataan buat tabel database, masukkan kueri yang dibuang dengan data, pernyataan untuk Indeks, kenaikan otomatis, dan banyak lagi. Kode PHP untuk mengekspor record database ke CSV adalah sebagai berikut.

<?php
$conn = mysqli_connect("localhost","root","test", "phppot_examples");

$query = "SELECT * FROM toy";
$result = mysqli_query($conn, $query);

$num_column = mysqli_num_fields($result);		

$csv_header = '';
for($i=0;$i<$num_column;$i++) {
    $csv_header .= '"' . mysqli_fetch_field_direct($result,$i)->name . '",';
}	
$csv_header .= "n";

$csv_row ='';
while($row = mysqli_fetch_row($result)) {
for($i=0;$i<$num_column;$i++) {
		$csv_row .= '"' . $row[$i] . '",';
}
	$csv_row .= "n";
}
?>

Dalam kode ini, struktur database dan data diekstraksi dan disiapkan dalam bentuk string CSV.

Kemudian konten cadangan yang telah disiapkan dapat diunduh ke browser dengan menggunakan fungsi PHP header() dengan spesifikasi if Jenis konten. Di bagian berikut, kita akan melihat cara mengunduh CSV dengan menggunakan Content-Type.

Bagaimana cara mengekspor CSV menggunakan fputcsv?

Jika Anda hanya akan mengambil cadangan data alih-alih database yang lengkap, maka fungsi fputcsv() sudah cukup. Fungsi ini menerima pegangan CSV target dan larik input sebagai argumen wajib.

Array input harus berisi baris nama kolom atau nilai kolom. Kode PHP berikut menunjukkan cara mengekspor catatan MySQL ke file CSV menggunakan fputcsv().

Dalam kode ini, nama dan nilai kolom database diekstraksi baris demi baris dan dimasukkan ke dalam CSV target. Pegangan CSV target dibuat sebelum menjalankan fungsi fputcsv().

<?php
$conn = mysqli_connect("localhost", "root", "test", "phppot_examples");

$filename = "toy_csv.csv";
$fp = fopen('php://output', 'w');

$query = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='phppot_examples' AND TABLE_NAME='toy'";
$result = mysqli_query($conn,$query);
while ($row = mysqli_fetch_row($result)) {
	$header[] = $row[0];
}	

header('Content-type: application/csv');
header('Content-Disposition: attachment; filename=".$filename);
fputcsv($fp, $header);

$query = "SELECT * FROM toy";
$result = mysqli_query($conn, $query);
while($row = mysqli_fetch_row($result)) {
	fputcsv($fp, $row);
}
exit;
?>

Unduh sebagai File CSV melalui browser menggunakan Content-Type

Dalam kode di atas, fungsi PHP header() digunakan untuk menentukan tipe Konten, disposisi Konten, dan spesifikasi lainnya. Dengan pengaturan ini, header akan dikirim ke browser dengan lampiran file CSV untuk diunduh.

Dengan menambahkan fungsi header() dengan Jenis konten: aplikasi/csv maka file CSV akan diunduh ke browser.

Baca CSV menggunakan fungsi bawaan PHP

PHP mendukung untuk membaca file CSV dengan membuktikan fungsi bawaan. Dalam artikel ini, kita telah melihat beberapa contoh untuk menangani CSV dengan fungsi PHP seperti fgetcsv(), str_getcsv(). Semua fungsi PHP ini digunakan di bagian di atas untuk membaca file CSV sebelum memprosesnya.

Fungsi fgetcsv() digunakan untuk membaca data file CSV dengan referensi pegangan file. str_getcsv() akan menerima string CSV sebagai ganti penunjuk file. Kemudian string CSV akan diurai untuk membaca data.

Kesimpulan

Karena CSV (Comma-Separated Values) adalah salah satu format penanganan data yang populer digunakan dan setiap programmer harus nyaman dalam menangani data CSV. PHP memberikan dukungan terbaik untuk menangani file CSV dan Anda harus mengetahui fungsi yang tersedia. Semoga Anda telah diperkenalkan dengan semua tentang CSV di PHP. Jika ada topik yang hilang, beri tahu saya melalui komentar di bawah dan saya akan memasukkannya ke dalam artikel.

Kembali ke Atas


Source link