Flutter 在flatter中读取带有头的csv文件映射
csv文件-place.csvFlutter 在flatter中读取带有头的csv文件映射,flutter,csv,flutter-layout,flutter-listview,Flutter,Csv,Flutter Layout,Flutter Listview,csv文件-place.csv zipcode,name,long,lat,alt 60603,"Chicago, Illinois,USA",-87.62,41.88,186 11101,"New York City, NY, USA",-73.93,40.73,10 如何以列表格式读取和存储此csv数据。我正在使用CSV软件包,但数据读取不正确 import 'package:flutter/material.dart'; import 'packa
zipcode,name,long,lat,alt
60603,"Chicago, Illinois,USA",-87.62,41.88,186
11101,"New York City, NY, USA",-73.93,40.73,10
如何以列表格式读取和存储此csv数据。我正在使用CSV软件包,但数据读取不正确
import 'package:flutter/material.dart';
import 'package:csv/csv.dart';
import 'package:flutter/services.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
//
Future<List<String>> loadAsset() async {
var myData = await rootBundle.loadString("assets/data/place.csv");
List<List<dynamic>> csvTable = CsvToListConverter(eol: "\r\n").convert(myData);
//
List<String> data = [];
csvTable[0].forEach((value) {
data.add(value.toString());
});
return data;
}
//
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('network test'),
),
body: Center(
child: FutureBuilder(
future: loadAsset(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
// this condition is important
if (snapshot.data == null) {
return Center(
child: Text('loading data'),
);
} else {
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, int index) {
return Center(child: Text(snapshot.data[index]));
});
}
}),
),
);
}
}
这是我得到的解决方案。alt字段正在与zipcode字段合并。您当前正在
csvTable
标题行的字段上循环
而不是:
csvTable[0]。forEach((值){
data.add(value.toString());
});
可能是:
csvTable.forEach((值){
data.add(value.toString());
});
您还可以使用map
而不是forEach
:
List data=csvTable.map((value)=>value.toString()).toList();
以下是对您的代码的回顾,其中包含一个域类City
,用于从API/资产文件中检索键入的数据:
完整源代码:
导入“包装:颤振/材料.省道”;
导入“包:csv/csv.dart”;
导入“包:flifter/services.dart”;
导入“package:freezed_annotation/freezed_annotation.dart”;
零件“66454899.csv.冻结.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
主页:主页(),
);
}
}
类主页扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“城市”),
),
正文:中(
孩子:未来建设者(
未来:City.fromAssetSV('assets/data/place.csv'),
生成器:(BuildContext上下文,异步快照){
if(snapshot.connectionState!=connectionState.done)
返回中心(子项:文本(“加载数据”);
if(snapshot.data==null | | snapshot.data.isEmpty)
返回中心(
子项:文本(“无数据”),
);
返回列表视图(
子项:snapshot.data
.地图(
(城市)=>ListTile(
标题:文本(城市名称),
字幕:文本(
“${city.zipCode}(${city.longitude},${city.latitude}”),
),
)
.toList(),
);
},
),
),
);
}
}
@冻结
抽象类City实现$City{
康斯特工厂城({
int zipCode,
字符串名,
双经度,
双纬度,
int alt,
})城市;
康斯特城;
来自csvRow的静态城市(列表csvRow){
返回城市(
zipCode:csvRow[0]作为int,
名称:csvRow[1]作为字符串,
经度:csvRow[2]为双精度,
纬度:csvRow[3]为双纬度,
alt:csvRow[4]作为int,
);
}
来自csvTable的静态列表(列表csvTable){
返回csvTable.skip(1).map((csvRow)=>City.fromCsvRow(csvRow)).toList();
}
静态列表fromCsvString(字符串csvString)=>
City.fromCsvTable(CsvToListConverter().convert(csvString));
静态将来自AssetSV(字符串assetPath)异步=>
City.fromCsvString(wait rootBundle.loadString(assetPath));
//静态未来网络CSV(字符串url)异步=>
//City.fromCsvString(等待http.get(url));
}
我想用csv数据映射标题名称。例如:zipcode:60603,name:“NYC,NY,USA”,等等…检查我的另一个答案,也许这个答案更适合你的要求;我没听清楚这句话。你能解释一下吗?我用的是城市班的。它在文件[66454899.csv.freezed.dart]
中生成代码。文件名来自我的主文件[66454899.csv.dart]
。冻结强制执行不变性。请注意,如果您感到困扰,您可以轻松实现City
类,而无需@Freezed
。我在未冻结的情况下将“无数据”作为输出。[66454899.csv.dart]文件中有什么内容?你能解释一下吗?这很可能是行尾编码的问题。顺便说一句,我认为csv
包中的eol
默认值是“\r\n”
。你在Linux上吗?也许您可以尝试使用“\n”
?
zipcode
name
long
lat
alt 60603
"Chicago, Illinois,USA"
-87.62
41.88
186 11101
"New York City, NY, USA"
-73.93
40.73
10
import 'package:flutter/material.dart';
import 'package:csv/csv.dart';
import 'package:flutter/services.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part '66454899.csv.freezed.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Cities'),
),
body: Center(
child: FutureBuilder<List<City>>(
future: City.fromAssetCsv('assets/data/place.csv'),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState != ConnectionState.done)
return Center(child: Text('loading data'));
if (snapshot.data == null || snapshot.data.isEmpty)
return Center(
child: Text('No data'),
);
return ListView(
children: snapshot.data
.map<ListTile>(
(city) => ListTile(
title: Text(city.name),
subtitle: Text(
'${city.zipCode} (${city.longitude}, ${city.latitude})'),
),
)
.toList(),
);
},
),
),
);
}
}
@freezed
abstract class City implements _$City {
const factory City({
int zipCode,
String name,
double longitude,
double latitude,
int alt,
}) = _City;
const City._();
static City fromCsvRow(List<dynamic> csvRow) {
return City(
zipCode: csvRow[0] as int,
name: csvRow[1] as String,
longitude: csvRow[2] as double,
latitude: csvRow[3] as double,
alt: csvRow[4] as int,
);
}
static List<City> fromCsvTable(List<List<dynamic>> csvTable) {
return csvTable.skip(1).map((csvRow) => City.fromCsvRow(csvRow)).toList();
}
static List<City> fromCsvString(String csvString) =>
City.fromCsvTable(CsvToListConverter().convert(csvString));
static Future<List<City>> fromAssetCsv(String assetPath) async =>
City.fromCsvString(await rootBundle.loadString(assetPath));
// static Future<List<City>> fromNetworkCsv(String url) async =>
// City.fromCsvString(await http.get(url));
}