Insert file berekstensi .dat kedalam database

Saya sudah dapat menjalankan import file .dat kedalam tabel di database. Yang jadi masalah bagaimana cara membedakan pemisah (explode) menggunakan "spasi" dengan "tabulasi". File .dat saya menggunakan 2 macam pemisah tersebut. yang jadi permasalah adalah pemisah "tabulasi" tersebut, sehingga kalimat sebelum tabulasi dengan sesudahnya ter-record didalam 1 kolom.

berikut file .dat yang saya miliki,
     1001	2021-01-05 11:36:13	1	0	1	0
     1001	2021-01-05 11:37:44	1	0	1	0
     1001	2021-01-05 11:45:43	1	0	1	0
     1001	2021-01-05 11:46:19	1	0	16	0
     1001	2021-01-05 11:46:51	1	0	2	0

sehingga apabila saya insert into tabel, maka yang masuk kedalam tabel seperti berikut,
1001 2021-01-05
perhatikan pada angka 1001 dengan 2021-01-05 dipisahkan dengan tabulasi pada file .dat nya sehingga setelah terecord di tabel ditempatkan didalam 1 kolom yang sama, tidak terpisah ke masing-masing kolom yang ditentukan.

Berikut adalah script php yang saya gunakan,
<?php
include "../../koneksi.php";

//Upload File
if (isset($_POST['submit'])) {

    if (is_uploaded_file($_FILES['filename']['tmp_name'])) {
        
    }

$handle = fopen($_FILES['filename']['tmp_name'], "r");
if ($handle) {
$hostname1 = 'localhost';
$username1 = 'root';
$password1 = 'rootroot';
$database1 = 'simp';

$con = mysqli_connect($hostname1, $username1, $password1, $database1);
    //$con = new mysqli($db_hostname, $db_username, $db_password, $db_databasename);
    while (($line = fgets($handle)) !== false) {
        // process the line read.
        $line_exp = explode(" ", $line);
        foreach($line_exp as $row){
          $row = explode('  ',$row);
            foreach($row as $cell){
              echo $cell;
              $userid = $line_exp[5];
              $tanggal = $line_exp[1];
              $jam = $line_exp[2];
              $uid = $line_exp[3];
              $role = $line_exp[4];
              $jenis = $line_exp[5];
              $pass = $line_exp[6];
              $stmt = $con->prepare("INSERT into upload_tb(userid, tanggal, jam, uid, role, jenis, pass) values(?,?,?,?,?,?,?)");
              $stmt->bind_param("sssssss", $userid, $tanggal, $jam, $uid, $role, $jenis, $pass);
              $stmt->execute();
    }
  }
}
    $stmt->close();
    fclose($handle);
} else {
    // error opening the file.
  }
}

$aksi="module/upload/upload_aksi.php";


switch($_GET[aksi]){
default:
?>
pada codingan diatas, saya coba tambahkan foreach untuk spasi dan tabulasi tetapi tidak berguna/hasil masih seperti yang sebelumnya.

apakah ada saran selain penggunaan explode() ? seperti preg_split() atau str_split() atau str_word_count() atau yang lainnya?
avatar barkah03

@barkah03

33 Kontribusi 9 Poin

  • saya kurang paham. Yang sekarang terjadi apa? dan yang dimau apa? boleh kasih contoh kondisi tabel sekarang - @hilmanski


Jawaban

saya sudah ketemu dengan solusinya,
ganti script berikut,
while (($line = fgets($handle)) !== false) {
        // process the line read.
        $line_exp = explode(" ", $line);
        foreach($line_exp as $row){
          $row = explode('  ',$row);
            foreach($row as $cell){
              echo $cell;
              $userid = $line_exp[5];
              $tanggal = $line_exp[1];
              $jam = $line_exp[2];
              $uid = $line_exp[3];
              $role = $line_exp[4];
              $jenis = $line_exp[5];
              $pass = $line_exp[6];
              $stmt = $con->prepare("INSERT into upload_tb(userid, tanggal, jam, uid, role, jenis, pass) values(?,?,?,?,?,?,?)");
              $stmt->bind_param("sssssss", $userid, $tanggal, $jam, $uid, $role, $jenis, $pass);
              $stmt->execute();
    }
  }
}
sehingga menjadi berikut,
while (($line = fgets($handle)) !== false) {
        // process the line read.
        $userid= substr($line, 5, 4);
        $tanggal = substr($line, 10, 10);
        $jam = substr($line, 21, 8);
        $uid = substr($line, 30, 1);
        $role = substr($line, 32, 1);
        $jenis = substr($line, 34, 2);
        $pass = substr($line, 37, 1);
        $stmt = $con->prepare("INSERT into upload_tb(userid, tanggal, jam, uid, role, jenis, pass) values(?,?,?,?,?,?,?)");
        $stmt->bind_param("sssssss", $userid, $tanggal, $jam, $uid, $role, $jenis, $pass);
        $stmt->execute();
    }

Inti nya saya menggunakan substr() dikarenakan file .dat tidak menggunakan pemisah yang berkarakter didalam file tersebut, hanya menggunakan spasi atau tabulasi sehingga kita harus menghitung mulai karakter keberapa hingga berapa banyak karakter yang diinginkan, berbeda dengan file .csv yang didalam file memiliki pemisah yang berkarakter seperti koma(,) ataupun titik koma(;)
avatar barkah03

@barkah03

33 Kontribusi 9 Poin


Login untuk gabung berdiskusi