You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart处理CSV文件仅输出HELLO,无预期内容问题排查

问题描述

我有如下CSV文件内容:

"artist","title","status","date","longitude","latitude"
"Queen","Fat Bottomed Girls","N/A","2024-04-09T22:03:30.164Z","N/A","N/A"
"W&W & AXMO","Heaven Is a Place On Earth","N/A","2024-04-09T21:59:34.614Z","N/A","N/A"
"Kleks & sanah","Jestem Twoją Bajką","N/A","2024-04-07T05:07:22.333Z","N/A","N/A"
"Oskar Cyms","Nigdy wcześniej","N/A","2024-04-06T04:49:43.106Z","N/A","N/A"
"Heidi Montag","I'll Do It","N/A","2024-04-04T07:23:10.340Z","N/A","N/A"
"vowl. & Sace","2000","N/A","2024-04-04T07:22:53.608Z","N/A","N/A"
"City High","What Would You Do?","N/A","2024-04-03T20:22:52.658Z","N/A","N/A"
"City High","What Would You Do?","N/A","2024-04-03T20:22:32.131Z","N/A","N/A"
"Kleks, IGO, Kaśka Sochacka, Mrozu, Artur Rojek, Brodka, Ralph Kaminski, Bedoes 2115 & Sokół","Całkiem Nowa Bajka","N/A","2024-03-29T23:39:11.413Z","N/A","N/A"

我需要将其转换为如下格式:

Queen - Fat Bottomed Girls
Kleks, IGO, Kaśka Sochacka, Mrozu, Artur Rojek, Brodka, Ralph Kaminski, Bedoes 2115 & Sokół - Całkiem Nowa Bajka

但我的Dart代码仅输出HELLO:

import 'package:shazam/shazam.dart' as shazam;
import 'dart:io';
import 'package:csv/csv.dart';

void main() async {
  try {
    final String csvData = await readFile('../SyncedShazams.csv'); 
    final List<List<dynamic>> rows = const CsvToListConverter().convert(csvData);
    print("HELLO");
  
    // Skip the header and process each row
    for (var row in rows.skip(1)) {
      if (row.length > 1) {
        // Artists and song title are expected to be in the first and second columns respectively
        print('${row[0]} - ${row[1]}');
      }
    }
  } catch (e) {
    print('Failed to process CSV: $e');
  }
}

Future<String> readFile(String filePath) async {
  final file = File(filePath);
  try {
    return await file.readAsString();
  } catch (e) {
    throw Exception('Failed to read the file: $e');
  }
}

运行输出:

$ dart run
Building package executable... 
Built shazam:shazam.
HELLO

请问我遗漏了什么?


问题排查与解决

1. 优先检查文件路径

代码里用的相对路径../SyncedShazams.csv大概率是问题根源。执行dart run时,当前工作目录是项目根目录,../会指向根目录的上级文件夹,如果你的CSV文件实际在项目根目录下,路径要改成./SyncedShazams.csv或者直接写SyncedShazams.csv。

可以给readFile加几行调试代码,确认文件是否存在:

Future<String> readFile(String filePath) async {
  final file = File(filePath);
  print("文件绝对路径: ${file.absolute.path}");
  print("文件是否存在: ${await file.exists()}");
  try {
    return await file.readAsString();
  } catch (e) {
    throw Exception('读取文件失败: $e');
  }
}

2. 验证CSV解析结果

就算没触发异常,也可能CSV解析后rows为空。在print("HELLO");后面加一行:

print("解析到的总行数: ${rows.length}");

如果输出是解析到的总行数: 0,说明解析失败,可能是换行符不兼容。可以指定解析器的换行符参数:

final List<List<dynamic>> rows = const CsvToListConverter(eol: '\n').convert(csvData);

3. 确认循环是否执行

在循环内部加调试输出,看看有没有遍历到数据行:

for (var row in rows.skip(1)) {
  print("正在处理行: $row");
  if (row.length > 1) {
    print('${row[0]} - ${row[1]}');
  }
}

修复后的完整示例代码

修正路径并添加调试的代码如下:

import 'dart:io';
import 'package:csv/csv.dart';

void main() async {
  try {
    // 假设CSV文件在项目根目录,修正路径
    final String csvData = await readFile('SyncedShazams.csv'); 
    final List<List<dynamic>> rows = const CsvToListConverter(eol: '\n').convert(csvData);
    print("HELLO");
    print("解析到的总行数: ${rows.length}");
  
    // 跳过表头处理数据行
    for (var row in rows.skip(1)) {
      print("正在处理行: $row");
      if (row.length > 1) {
        print('${row[0]} - ${row[1]}');
      }
    }
  } catch (e) {
    print('处理CSV失败: $e');
  }
}

Future<String> readFile(String filePath) async {
  final file = File(filePath);
  print("文件绝对路径: ${file.absolute.path}");
  print("文件是否存在: ${await file.exists()}");
  try {
    return await file.readAsString();
  } catch (e) {
    throw Exception('读取文件失败: $e');
  }
}

内容的提问来源于stack exchange,提问作者user3523406

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:32:09