【发布时间】:2015-10-06 00:05:11
【问题描述】:
我正在开发一个网站,希望管理员能够上传包含员工 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 解决了问题
【问题讨论】:
-
必须是纯文本吗?最好是像 JSON 或 XML 这样的结构合理的数据格式,否则即使使用 CSV 也会使事情变得更加明确。这注定会让您头疼,因为您无法控制输入的质量。例如,通过使用 JSON,您至少可以确保在开始尝试解析之前传递了一个可解析的文件(即通过执行
json_decode(file_get_contents($file))) -
它以 .xlsx 格式提供,因此可以转换为 .csv
-
在foreach中使用file()和explode()
-
查看原生 CSV 函数,它们会为您省去很多精力。开发以捕获所有边缘情况将非常耗时php.net/manual/en/function.str-getcsv.php
-
我去看看 Mike,谢谢。