【发布时间】:2017-01-11 02:51:05
【问题描述】:
我正在尝试从文本文件中获取数据并将数据传递到数据库。问题是,每次我重新加载视图时,都会发送数据,这意味着我会收到重复的数据,有没有办法防止这种情况发生?可能是截断文件或保存处理的最后一行的行号?
另外,文本文件的生成方式是我每天都会得到一个新的文本文件,文件名上带有日期,所以我想的另一种方法可能是创建一个新的数据库表,我会在其中标记每个我将文件处理为“已处理”,因此该函数不会多次处理同一文件。
这是文本文件的示例:
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());
});
【问题讨论】:
-
是 txt 文件还是制表符分隔的 csv?
-
通过
get路由处理您的表单请求是一种不好的做法。试试看下面我的解决方案,看看它是否适合你。 -
@Jeff 这是一个具有固定宽度列的文本文件。