【環境】
Flutter 3.7.7
Dart 2.19.4
【パッケージ】
http
charset_converter
csv
【サンプルコード】
Future<List<List<dynamic>>> getCsvDatas() async {
List<List<dynamic>> csvDatas = [];
final response = await http.get(Uri.parse('https://your.csv.url.csv'));
if(response.statusCode == 200){
final utf8Data = await CharsetConverter.decode('Shift_JIS', response.bodyBytes);
csvDatas = CsvToListConverter(shouldParseNumbers: false).convert(utf8Data);
} else {
// エラーハンドリング追加する
return csvDatas;
}
return csvDatas;
}
今回取得したCSVは文字コードがShift_JISとします。
charset_converterパッケージを使用してCharsetConverter.decode('Shift_JIS',contents),でShift_JISからUTF-8へと変換しています。
その後行っているCsvToListConverter(shouldParseNumbers: false).convert(utf8Data)はcsvパッケージを使用してCSVデータをリストへ変換しています。
ここで注意したいのがshouldParseNumbers: falseです。
これはCSVデータ内の数字は数値として解析されず、文字列として扱われます。つまり、CSV内のすべてのデータは文字列として扱われ、数値に変換されることはありません。
【なぜshouldParseNumbers: falseを使用しているのか?】
今回取得したCSVデータの中に00000がありました。
このデータは00000として扱いたかった為、shouldParseNumbers: trueでは、整数として扱われるので0として解析されてしまいます。
この様な理由からshouldParseNumbers: falseにしています。
【最後に】
csvデータの文字コードを変換する方法の記載になりましたが、いろいろと応用はできると思いますので参考になれば幸いです。
また、charset_converterパッケージはShift_JISだけではなく他の文字コードにも対応していますので、とても便利なパッケージだと思います。
お時間あれば確認してみて下さい。