У Dart проблемы с файлами CSV

У меня есть следующий 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

Что я пропустил?

Кажется, ваш код работает для меня. Вы уверены, что имя файла и путь к нему верны? Вы уверены, что сохранили файл CSV? Возникают ли какие-либо исключения или отображаются сообщения об ошибках?

mmcdon20 13.04.2024 07:19

Я обновил свой вопрос. Путь кажется правильным, и Дарт не жалуется на отсутствие файла.

user3523406 13.04.2024 07:29

Какой результат вы получите, если print(rows); после print('HELLO')?

mmcdon20 13.04.2024 07:35

Я добавил 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?

user3523406 13.04.2024 07:58

Возможно, это проблема с завершением строки? Какие окончания строк используются в вашем файле .csv?

jamesdlin 13.04.2024 08:16
$ 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
user3523406 13.04.2024 08:48

Я не думаю, что эти grep команды делают то, что вы думаете. Я плохо владею awk и не могу судить о правильности. Обычно я предлагаю просто использовать команду file, которая обычно сообщает, есть ли в файле окончания строк CRLF, но, AFAICT, это не так для файлов CSV. Возможно, попробуйте dos2unix -ih ../SyncedShazams.csv (или просто откройте файл CSV в VS Code, Sublime Text или где-то еще).

jamesdlin 13.04.2024 09:26
$ 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
user3523406 13.04.2024 10:22

Пожалуйста, найдите здесь весь файл CSV.

user3523406 13.04.2024 13:37

Кажется, разделитель строк должен быть CR+LF, согласно datatracker.ietf.org/doc/html/rfc4180

lrn 13.04.2024 17:57
0
10
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После загрузки CSV-файла выяснилось, что проблема действительно в окончаниях строк, как указал Джеймсдлин:

Я использовал окончания строк CRLF (\r\n), а в вашем файле используются окончания строк LF (\n).

Здесь у вас есть 2 возможных решения.

  1. Преобразуйте файл, используя окончания строк \r\n.

  2. Обновите код, чтобы ожидать окончания строк \n. Как оказалось, CsvToListConverter() ожидает \r\n по умолчанию, но вы можете передать именованный параметр eol вот так CsvToListConverter(eol: '\n').

Другие вопросы по теме