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
相关产品推荐
相关产品推荐

