PHP解析.txt

时间:2015-07-16 13:43:32

标签: php mysql parsing

我正在网站上工作,希望管理员能够上传一个包含员工ID和姓名的.txt文件。我需要解析.txt文件并将信息插入数据库,但我在解析时不断收到错误。

我尝试遵循PHP - parsing a txt file的格式,但在我的第一个$ row explode()之后,我开始收到几个非法或未定义的偏移错误。

.txt:

186298  "Cushing,Kathy N"
167876  "Roberts,Joseph Allen"
109876  "Smith,Sarah Quinn"
118679  "Hernandez,Juan"
187568  "Freeman,Colby Matthew"

.php功能:

function updateMemberList()
{
        global $db_handle;
        $tmpName = $_SESSION['filename'];
        //$include_once ($_SERVER['DOCUMENT_ROOT'] . "../../uploads/updates/'$tmpName'");
        $txt_file = file_get_contents("../../uploads/updates/$tmpName");
        $rows = explode("\n", $txt_file);

        foreach($rows as $row => $data)
        {
            //Splits data into employee ID and full name
            $row_data = explode(' ', $data);

            $info[$row]['empid'] = $row_data[0];
            $info[$row]['name'] = $row_data[1];     //AFTER this line is where I start having errors

            //Splits name into last name and first name
            $row_name = explode(',', $info[$row]['name']);
            $info[$row_name]['lname'] = $row_name[0];
            $info[$row_name]['fname'] = $row_name[1];

            //Cleans " off last name
            $row_lname = explode('"', $info[$row_name]['lname']);
            $info[$row_lname]['lname'] = $row_lname[1];

            //Cleans middle name and " off first name
            $row_fname1 = explode(' ', $info[$row]['fname']);
            $info[$row]['fname'] = $row_fname1[0];
            $row_fname2 = explode('"', $info[$row]['fname']);
            $info[$row]['fname'] = $row_fname2[0];

            //Declares variables
            $uname = $info[row]['fname'] + "." + $info[$row]['lname'];
            $fname = $info[row]['fname'];
            $lname = $info[$row]['lname'];
            $empid = $info[$row]['empid'];

            //Checks to see if user is already in db
            $query = ("SELECT * FROM user WHERE username = '$uname'");
            $check = mysqli_query($db_handle, $query);
            $num_rows = $check->num_rows;

            //If user isn't in db, generates a password and adds them
            if ($num_rows < 1)
            {
                //Generates random 8 character password
                $length = 8;
                $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
                $charactersLength = strlen($characters);
                for ($i = 0; $i < $length; $i++)
                {
        $randomString[$i] = $characters[rand(0, $charactersLength - 1)];
                }
                $temppass = implode($randomString);
                $pword = password_hash($temppass, PASSWORD_DEFAULT);
                $addto = "INSERT INTO `user`(`username`, `first_name`, `last_name`, `employee_id`, `password_hash`, `isActive`, `firstLogin`) VALUES ('$uname', '$fname', '$lname', '$empid', '$pword', 1, 1)";
                mysqli_query($db_handle, $addto);
            }
        }
    }

有没有办法在选项卡之后进行解析,这样可以更简单地获取名字和姓名而不会对我大喊大叫?

编辑:通过交换为.csv代替.txt来解决问题

4 个答案:

答案 0 :(得分:3)

使用正则表达式使它更简单,你也不需要爆炸('\ n')只是file()函数

  foreach($rows as $row => $data) { 
     $matches = array();
     preg_match('#([0-9]+).*? "([^""]+?)"#', $data, $matches);
     echo $matches[1]; //id
     echo $matches[2]; //name
  }

你也可以改变

    $txt_file = file_get_contents("../../uploads/updates/$tmpName");
    $rows = explode("\n", $txt_file);

    $rows = file("../../uploads/updates/$tmpName");

Morover,生成随机8长度字符串使用

$temppass = bin2hex(openssl_random_pseudo_bytes(4));

它更安全。

答案 1 :(得分:0)

试试这个。 while循环的第一行:

//Splits data into employee ID and full name
$row_data   = array_map("trim", array_filter(explode('"', $data)));
$names      = explode(",", $row_data[1]);
$result     = array(
    "id"        => $row_data[0],
    "forname"   => $names[1],
    "surname"   => $names[0],
);

$ result应如下所示:

Array
(
    [id] => 186298
    [forname] => Kathy N
    [surname] => Cushing
)

希望这有用。

答案 2 :(得分:0)

https://stackoverflow.com/users/1552594/mike-miller的后续建议,并从.txt到.csv文件交换。这使得一切都更容易贯穿并解决了所有错误。

答案 3 :(得分:-1)

你需要爆炸2个空格:

$row_data = explode('  ', $data);