【发布时间】:2020-10-26 12:15:11
【问题描述】:
我有一个报告表。一份报告可以有许多文档(它们是 csv 文件路径)。一个文档有很多映射。
所以我最初循环我的文档以获取报告并使用 ParseCsv 加载 csv 数据
foreach ($this->report->uploadedDocuments->documents as $document) {
$csv = new ParseCsv\Csv();
$csv->limit = 1;
$csv->parse(storage_path("app/" . $document->fullName));
$this->csvData = $csv->data;
}
如果我输出这个,我会为每个文档看到类似以下内容(此处仅显示一个文档中的一个 CSV 行)
[
{
"id":"1",
"field1":"Some data",
"something":"Some data",
"something":"Some data",
"something":"Some data",
"something":"Some data",
}
]
现在每个文档都有映射,所以我也可以这样做
foreach ($this->report->uploadedDocuments->documents as $document) {
//Load CSV data
foreach ($document->mappings as $column) {
Log::debug(json_encode($column));
}
}
上面的输出是这样的
{
"document_id":"6434fc74-18f7-43ff-be33-3a8b0cf1cadc",
"field1":1,
"field2":null,
"field3":null,
"created_at":"2020-10-26T10:19:36.000000Z",
"updated_at":"2020-10-26T10:19:36.000000Z"
}
所以从上面我可以看到 field1 位于 csv 数据的第 1 列(索引)中。我还可以看到这个 CSV 没有 field2 或 field3。所以我的想法是把原来的CSV数据变成这个
[
{
"field1":"Some data",
}
]
这就是我的想法。我首先需要循环报告文档,加载 CSV 文件并读取数据
foreach ($this->analysis->uploadedDocuments->documents as $document) {
$csv = new ParseCsv\Csv();
$csv->limit = 5;
$csv->parse(storage_path("app/" . $document->fullName));
if (empty($csv->data)) {
throw new Exception('Not data found in file.');
}
foreach ($csv->data as $dataKey => &$item) {
foreach ($item as $key => $value) {
//Now I have access to the keys and values from csv
}
}
}
但是,我该如何对照我的文档映射进行交叉检查呢?我显然必须循环映射,但我应该在哪里做呢?我有一些我认为可以工作的东西,但它非常混乱,并且依赖于我知道列名,例如
foreach ($this->report->uploadedDocuments->documents as $document) {
$csv = new ParseCsv\Csv();
$csv->limit = 5;
$csv->parse(storage_path("app/" . $document->fullName));
if (empty($csv->data)) {
throw new Exception('Not data found in file.');
}
foreach ($document->mappings as $column) {
foreach ($csv->data as $dataKey => &$item) {
foreach ($item as $key => $value) {
//match the mapping column to the csv column
if ($column->fieldOne !== NULL && $key === $column->fieldOne) {
//now I have access to the values for that column
}
}
}
}
}
会有更好的方法来实现这样的目标吗?
谢谢
【问题讨论】: