我试图从文本文件中获取数据并将数据传递给数据库。问题是,每次重新加载视图时,数据都会被发送,这意味着我会获得重复的数据,有没有办法防止这种情况发生?也许截断文件或保存已处理的最后一行的行号?
此外,生成文本文件的方式是我每天都会获得一个新文本文件,其中包含文件名称上的日期,所以我想的另一种方法是创建一个新的数据库表,我会在其中标记每个文件文件我处理为"已处理"所以函数不会多次处理同一个文件。
以下是文本文件的示例:
1618 0002 9 9 505 04129284134 4141191269 4141191269 56984 4 002 001 4
1606 0000 9 1159 4169191388 4169191388 4 012 0
1607 0009 7 9 505 04129284134 1245 1245 56984 4
1619 0000 9 6 1172 2129922686 2129922686 4 013 0
1606 0000 9 1159 4169191388 4169191388 4 012 0
1607 0009 7 9 505 04129284134 1245 1245 56984 4
1619 0000 7 6 521 1188# 1172 1172 0 001 4
1606 0000 9 1159 4169191388 4169191388 4 012 0
1607 0009 7 9 505 04129284134 1245 1245 56984 4
以下是我在路线文件中使用的功能:
Route::get('calls', function () {
foreach (file(public_path() . "/calls.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) {
$calls = new Calls();
$calls->time = trim(substr($line, 0, 4));
$calls->duration = trim(substr($line, 5, 4));
$calls->cond_code = trim(substr($line, 10, 1));
$calls->code_dial = trim(substr($line, 15, 1));
$calls->code_used = trim(substr($line, 18, 3));
$calls->dialed_num = trim(substr($line, 24, 11));
$calls->calling_num = trim(substr($line, 39, 11));
$calls->clg_num_in_tac = trim(substr($line, 53, 11));
$calls->auth_code = trim(substr($line, 64, 5));
$calls->frl = trim(substr($line, 70, 1));
$calls->ixc_code = trim(substr($line, 77, 3));
$calls->in_crt_id = trim(substr($line, 85, 3));
$calls->save();
}
return View::make('test')
->with('calls', Calls::all());
});
答案 0 :(得分:0)
问题在于实施。
使用当前实现,如果您需要限制重复项,则需要将每个输入与数据库记录相匹配。
但这是一个非常糟糕的设计并且非常不合理。
您要做的是在表单中添加file input
字段,并在表单中添加POST
。然后处理这样的表格。
Route::post('calls', function () {
// your code goes here...
});
完成后,您可以重定向到另一条路线。