У меня есть следующий 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? Возникают ли какие-либо исключения или отображаются сообщения об ошибках?