flutter - 防止在颤动中覆盖值
问题描述
如何防止在以下情况下覆盖我的值。
我正在阅读 Excel 文件的每一行,将我的价格和产品保存在两个列表中,然后使用 zip 功能将这两个列表与第三个列表结合起来。
for (var productsPricesStock in zip([
products,
prices,
row.sublist(3, maxCols),
])) {
standValues[productsPricesStock[0]] = {
'name': productsPricesStock[0].toString(),
'price': productsPricesStock[1].toString(),
'stock': productsPricesStock[2].toString(),
};
}
然后我保存这个值图
if (!startingStock[tourNumber].contains(standName)) {
Map standObject = {standName: standValues};
startingStock[tourNumber].add(standObject);
}
我的问题是我的条目被下一个条目的值覆盖:这是第一行的第一个条目,例如:
这是第二行的第一个条目:
正如您在此处看到的,第一行现在与第二行具有相同的条目:
这将发生在每一行,这意味着最后所有行都具有最后一行的值。
我很确定它与存储对值而不是值的引用有关,但我不确定如何防止这种情况。
高度赞赏帮助!
完整的功能代码:
List<dynamic> products = [];
List<dynamic> prices = [];
Map<String, dynamic> startingStock = {};
Map<String, dynamic> standValues = {};
Future<void> _readExcel() async {
try {
var bytes = _tempFile.readAsBytesSync();
var excel = Excel.decodeBytes(bytes);
for (var table in excel.tables.keys) {
int maxCols = excel.tables[table].maxCols;
for (var row in excel.tables[table].rows) {
if (row[2] == 'Produkt') {
row.removeWhere(
(product) => product == null || product == 'Produkt');
products = row;
}
if (row[2] == 'Preis') {
row.removeWhere((price) =>
price == null || price == 'Stand' || price == 'Preis');
prices = row;
}
}
for (var row in excel.tables[table].rows) {
if (row[0] != 'TP-Master' && row[0] != null && row[1] != null) {
var tourNumber = row[0].toString();
var standName = row[1].toString();
if (!startingStock.containsKey(tourNumber)) {
startingStock[tourNumber] = [];
}
if (!startingStock[tourNumber].contains(standName)) {
Map standObject = {standName: standValues};
startingStock[tourNumber].add(standObject);
}
for (var productsPricesStock in zip([
products,
prices,
row.sublist(3, maxCols),
])) {
standValues[productsPricesStock[0]] = {
'name': productsPricesStock[0].toString(),
'price': productsPricesStock[1].toString(),
'stock': productsPricesStock[2].toString(),
};
}
}
}
}
successSnackBar('Die Datei wurde erfolgreich gelesen!');
} catch (err) {
print(err);
errorSnackBar('Beim lesen der Datei ist ein Fehler aufgetreten!');
}
}
这是 excel 文件的摘录。
在第 5 行中,您可以看到所有产品。在第 6 行,您可以看到每种产品的价格。在之后的行中,您可以在第一列中看到旅游编号和相关的商店名称以及商店拥有的每种产品的数量。
在我的代码中,我尝试以 tournumber[shopname] 格式存储我的数据,然后映射价格、产品名称和产品数量。
用于测试的 Excel: https ://docs.google.com/spreadsheets/d/1p9Z5yQ2u8sVDmEdbD9dYyYPwlQqdXWeZJp2BjvoexU4/edit?usp=sharing
这是使用示例 excel 执行后列表和地图的外观。
products = [
Spargel W,
Spargel V,
gestrig Spargel W,
gestrigSpargel V,
Erdbeer 1,
Erdbeer 2
]
prices = [10.90, 8.90, x, x, x, 2,50 ]
startingStock = {
'T1' : [U-Stephansplatz[
Spargel W: {
'name': Spargel W,
'price': '10.9',
'stock': '30'
}
Spargel V: {
...
}
Spargel W gestern: {
...
}
...
],
Rugenbarg[
Spargel W: {...},
Spargel V: {...}
Spargel W gestern: {...}
...]
] ...
, 'T2': [
Volksdorf : [
Spargel W: {
'name': Spargel W,
'price': '10.9',
'stock': '45'
}
Spargel V: {
...
}
Spargel W gestern: {
...
}
...],
Poppenbüttel [
Spargel W: {...},
Spargel V: {...}
Spargel W gestern: {...}
...]
] ...}
standValues 仅包含当前行的值,因此在这种情况下,它将包含最后一行的值。(T2 站 Fuhle Nord )
standValues = [Spargel W: {name: Spargel W, price: 10.9, stock: 23} Spargel V: ..., Spargel W gestrig: ..., ...]
解决方案
我已经对您的代码进行了一些重构并清理了一些类型,因此它们更加具体。我希望这接近你想要的:
import 'dart:convert';
import 'dart:io';
import 'package:quiver/iterables.dart';
import 'package:excel/excel.dart';
Future<void> main() async {
await _readExcel();
}
Future<void> _readExcel() async {
final startingStock =
<String, Map<String, Map<String, Map<String, String>>>>{};
try {
final bytes = File('StackOverflow.xlsx').readAsBytesSync();
final excel = Excel.decodeBytes(bytes);
for (final table in excel.tables.values) {
final products = <String>[];
final prices = <String>[];
for (final row in table.rows) {
if (row[2] == 'Produkt') {
row.removeWhere(
(Object product) => product == null || product == 'Produkt');
products.addAll(row.map((Object e) => e.toString()));
}
if (row[2] == 'Preis') {
row.removeWhere((Object price) =>
price == null || price == 'Stand' || price == 'Preis');
prices.addAll(row.map((Object e) => e.toString()));
}
}
for (final row in table.rows) {
if (row[0] != 'TP-Master' && row[0] != null && row[1] != null) {
final tourNumber = row[0].toString();
final standName = row[1].toString();
final standValues = startingStock
.putIfAbsent(tourNumber, () => {})
.putIfAbsent(standName, () => {});
for (final productsPricesStock in zip<dynamic>([
products,
prices,
row.sublist(3, table.maxCols),
])) {
standValues[productsPricesStock[0].toString()] = {
'name': productsPricesStock[0].toString(),
'price': productsPricesStock[1].toString(),
'stock': productsPricesStock[2].toString(),
};
}
}
}
}
print(json.encode(startingStock));
print('Die Datei wurde erfolgreich gelesen!');
} catch (err) {
print(err);
print('Beim lesen der Datei ist ein Fehler aufgetreten!');
}
}
以格式化的 JSON 格式输出:
{
"T1":{
"U-Stephansplatz":{
"Spargel W":{
"name":"Spargel W",
"price":"10.9",
"stock":"30.0"
},
"Spargel V":{
"name":"Spargel V",
"price":"8.9",
"stock":"12.0"
},
"Spargel W gestrig":{
"name":"Spargel W gestrig",
"price":"x",
"stock":"0.0"
},
"Spargel V gestrig":{
"name":"Spargel V gestrig",
"price":"x",
"stock":"0.0"
},
"Erdbeer 1":{
"name":"Erdbeer 1",
"price":"x",
"stock":"0.0"
},
"Erdbeer 2":{
"name":"Erdbeer 2",
"price":"2.5",
"stock":"0.0"
}
},
"Rugenbarg":{
"Spargel W":{
"name":"Spargel W",
"price":"10.9",
"stock":"25.0"
},
"Spargel V":{
"name":"Spargel V",
"price":"8.9",
"stock":"124.0"
},
"Spargel W gestrig":{
"name":"Spargel W gestrig",
"price":"x",
"stock":"0.0"
},
"Spargel V gestrig":{
"name":"Spargel V gestrig",
"price":"x",
"stock":"0.0"
},
"Erdbeer 1":{
"name":"Erdbeer 1",
"price":"x",
"stock":"0.0"
},
"Erdbeer 2":{
"name":"Erdbeer 2",
"price":"2.5",
"stock":"34.0"
}
},
"Blankenese":{
"Spargel W":{
"name":"Spargel W",
"price":"10.9",
"stock":"22.0"
},
"Spargel V":{
"name":"Spargel V",
"price":"8.9",
"stock":"12.0"
},
"Spargel W gestrig":{
"name":"Spargel W gestrig",
"price":"x",
"stock":"0.0"
},
"Spargel V gestrig":{
"name":"Spargel V gestrig",
"price":"x",
"stock":"0.0"
},
"Erdbeer 1":{
"name":"Erdbeer 1",
"price":"x",
"stock":"0.0"
},
"Erdbeer 2":{
"name":"Erdbeer 2",
"price":"2.5",
"stock":"21.0"
}
},
"Altona ZOB":{
"Spargel W":{
"name":"Spargel W",
"price":"10.9",
"stock":"22.0"
},
"Spargel V":{
"name":"Spargel V",
"price":"8.9",
"stock":"42.0"
},
"Spargel W gestrig":{
"name":"Spargel W gestrig",
"price":"x",
"stock":"0.0"
},
"Spargel V gestrig":{
"name":"Spargel V gestrig",
"price":"x",
"stock":"0.0"
},
"Erdbeer 1":{
"name":"Erdbeer 1",
"price":"x",
"stock":"0.0"
},
"Erdbeer 2":{
"name":"Erdbeer 2",
"price":"2.5",
"stock":"22.0"
}
},
"Holstenstraße":{
"Spargel W":{
"name":"Spargel W",
"price":"10.9",
"stock":"11.0"
},
"Spargel V":{
"name":"Spargel V",
"price":"8.9",
"stock":"24.0"
},
"Spargel W gestrig":{
"name":"Spargel W gestrig",
"price":"x",
"stock":"0.0"
},
"Spargel V gestrig":{
"name":"Spargel V gestrig",
"price":"x",
"stock":"0.0"
},
"Erdbeer 1":{
"name":"Erdbeer 1",
"price":"x",
"stock":"0.0"
},
"Erdbeer 2":{
"name":"Erdbeer 2",
"price":"2.5",
"stock":"65.0"
}
}
},
"T2":{
"Volksdorf":{
"Spargel W":{
"name":"Spargel W",
"price":"10.9",
"stock":"45.0"
},
"Spargel V":{
"name":"Spargel V",
"price":"8.9",
"stock":"34.0"
},
"Spargel W gestrig":{
"name":"Spargel W gestrig",
"price":"x",
"stock":"0.0"
},
"Spargel V gestrig":{
"name":"Spargel V gestrig",
"price":"x",
"stock":"0.0"
},
"Erdbeer 1":{
"name":"Erdbeer 1",
"price":"x",
"stock":"0.0"
},
"Erdbeer 2":{
"name":"Erdbeer 2",
"price":"2.5",
"stock":"4.0"
}
},
"Poppenbüttel":{
"Spargel W":{
"name":"Spargel W",
"price":"10.9",
"stock":"34.0"
},
"Spargel V":{
"name":"Spargel V",
"price":"8.9",
"stock":"435.0"
},
"Spargel W gestrig":{
"name":"Spargel W gestrig",
"price":"x",
"stock":"0.0"
},
"Spargel V gestrig":{
"name":"Spargel V gestrig",
"price":"x",
"stock":"0.0"
},
"Erdbeer 1":{
"name":"Erdbeer 1",
"price":"x",
"stock":"0.0"
},
"Erdbeer 2":{
"name":"Erdbeer 2",
"price":"2.5",
"stock":"43.0"
}
},
"Erdkampsweg":{
"Spargel W":{
"name":"Spargel W",
"price":"10.9",
"stock":"23.0"
},
"Spargel V":{
"name":"Spargel V",
"price":"8.9",
"stock":"34.0"
},
"Spargel W gestrig":{
"name":"Spargel W gestrig",
"price":"x",
"stock":"0.0"
},
"Spargel V gestrig":{
"name":"Spargel V gestrig",
"price":"x",
"stock":"0.0"
},
"Erdbeer 1":{
"name":"Erdbeer 1",
"price":"x",
"stock":"0.0"
},
"Erdbeer 2":{
"name":"Erdbeer 2",
"price":"2.5",
"stock":"5.0"
}
},
"Drosselstraße":{
"Spargel W":{
"name":"Spargel W",
"price":"10.9",
"stock":"432.0"
},
"Spargel V":{
"name":"Spargel V",
"price":"8.9",
"stock":"53.0"
},
"Spargel W gestrig":{
"name":"Spargel W gestrig",
"price":"x",
"stock":"0.0"
},
"Spargel V gestrig":{
"name":"Spargel V gestrig",
"price":"x",
"stock":"0.0"
},
"Erdbeer 1":{
"name":"Erdbeer 1",
"price":"x",
"stock":"0.0"
},
"Erdbeer 2":{
"name":"Erdbeer 2",
"price":"2.5",
"stock":"6.0"
}
},
"Fuhle Nord ":{
"Spargel W":{
"name":"Spargel W",
"price":"10.9",
"stock":"23.0"
},
"Spargel V":{
"name":"Spargel V",
"price":"8.9",
"stock":"34.0"
},
"Spargel W gestrig":{
"name":"Spargel W gestrig",
"price":"x",
"stock":"0.0"
},
"Spargel V gestrig":{
"name":"Spargel V gestrig",
"price":"x",
"stock":"0.0"
},
"Erdbeer 1":{
"name":"Erdbeer 1",
"price":"x",
"stock":"0.0"
},
"Erdbeer 2":{
"name":"Erdbeer 2",
"price":"2.5",
"stock":"0.0"
}
}
}
}
推荐阅读
- mongodb - Mongodb文本搜索(精确匹配、模糊匹配)
- javascript - 同步 iframe
- r - 如何在R中的同一图中将线图和箱线图与显着差异结合起来
- javascript - 带有 Express Swagger 生成器的自定义标头?
- git - 错误:GH008:您的推送引用了至少 4 个未知的 Git LFS 对象
- object-detection - 如何理解 yolov4 训练是否过拟合?
- twitter-bootstrap - 如何在 scss 中启用引导 rtl
- node.js - 请求失败,状态码 403,访问被拒绝:令牌无效,代码错误
- java - 如何在 sql 查询中传递参数而不使其在查询本身中显式?
- php - UNIX LF 到 Windows CR LF