У меня есть следующий CSV-файл:
$ cat ../SyncedShazams.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.
$ cat bin/shazam.dart
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
Что я пропустил?
Я обновил свой вопрос. Путь кажется правильным, и Дарт не жалуется на отсутствие файла.
Какой результат вы получите, если print(rows); после print('HELLO')?
Я добавил print(rows);, и он распечатал CSV-файл $ dart run | head HELLO [[artist, title, status, date, longitude, latitude Queen, Fat Bottomed Girls, N/A, 2024-04-09T22:03:30.164Z, 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. Что не так с циклом for?
Возможно, это проблема с завершением строки? Какие окончания строк используются в вашем файле .csv?
$ grep -c $'\n' ../SyncedShazams.csv 343 $ grep -c $'\r\n' ../SyncedShazams.csv 343 $ awk 'END { if (sub(/\r$/, "")) print "CR LF"; else print "LF" }' ../SyncedShazams.csv LFЯ не думаю, что эти grep команды делают то, что вы думаете. Я плохо владею awk и не могу судить о правильности. Обычно я предлагаю просто использовать команду file, которая обычно сообщает, есть ли в файле окончания строк CRLF, но, AFAICT, это не так для файлов CSV. Возможно, попробуйте dos2unix -ih ../SyncedShazams.csv (или просто откройте файл CSV в VS Code, Sublime Text или где-то еще).
$ file ../SyncedShazams.csv ../SyncedShazams.csv: CSV text и $ dos2unix -ih ../SyncedShazams.csv DOS UNIX MAC BOM TXTBIN FILE 0 343 0 no_bom text ../SyncedShazams.csvПожалуйста, найдите здесь весь файл CSV.
Кажется, разделитель строк должен быть CR+LF, согласно datatracker.ietf.org/doc/html/rfc4180
После загрузки CSV-файла выяснилось, что проблема действительно в окончаниях строк, как указал Джеймсдлин:
Я использовал окончания строк CRLF (\r\n), а в вашем файле используются окончания строк LF (\n).
Здесь у вас есть 2 возможных решения.
Преобразуйте файл, используя окончания строк \r\n.
Обновите код, чтобы ожидать окончания строк \n.
Как оказалось, CsvToListConverter() ожидает \r\n по умолчанию, но вы можете передать именованный параметр eol вот так CsvToListConverter(eol: '\n').
Кажется, ваш код работает для меня. Вы уверены, что имя файла и путь к нему верны? Вы уверены, что сохранили файл CSV? Возникают ли какие-либо исключения или отображаются сообщения об ошибках?