Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在flatter中读取带有头的csv文件映射_Flutter_Csv_Flutter Layout_Flutter Listview - Fatal编程技术网

Flutter 在flatter中读取带有头的csv文件映射

Flutter 在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

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 '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));
}