ためしにやってみました。
対話しながらプログラムを組む、そしてテストをしてみる、そのはじめとして。
入力データを特定するために
Flutter でやってもらいたいことを指示する
dependencies:
flutter:
sdk: flutter
http: ^0.13.3
path_provider: ^2.0.8
archive: ^3.1.6
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';
import 'package:archive/archive.dart';
Future<String> downloadAndExtract(String url) async {
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
Uint8List data = response.bodyBytes;
final archive = ZipDecoder().decodeBytes(data);
final outputDir = await getApplicationDocumentsDirectory();
ArchiveFile targetFile;
for (final file in archive) {
if (file.name.endsWith('.txt')) {
targetFile = file;
break;
}
}
if (targetFile != null) {
List<String> lines = utf8.decode(targetFile.content).split('\n');
return lines.take(50).join('\n');
} else {
throw Exception('No text file found in the archive.');
}
} else {
throw Exception('Failed to download and extract file.');
}
}
import 'package:flutter/material.dart';
import 'download_and_extract.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _displayText = '';
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Aozora Downloader'),
),
body: SingleChildScrollView(
padding: EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () async {
final url =
'https://www.ao
.gr.jp/cards/000123/files/59195_ruby_61170.zip';
try {
String text = await downloadAndExtract(url);
setState(() {
_displayText = text;
});
} catch (e) {
print('Error: $e');
}
},
child: Text('ダウンロードして解凍する'),
),
SizedBox(height: 16),
Text(_displayText),
],
),
),
),
);
}
}
検証用データを獲得しておく
[#7号][#小見出し]トロイ戦争はことごとく嘘である[#「トロイ戦争はことごとく嘘である」小見出し終わり]
[#3号][#小見出し]ジャン・ジラウドゥ[#「ジャン・ジラウドゥ」小見出し終わり]
[#7号][#小見出し]原題 LA GUERRE DE TROIE N'AURA PAS LIEUE[#「原題 LA GUERRE DE TROIE N'AURA PAS LIEUE」小見出し終わり]
[#3号][#小見出し]邦訳 加藤恵三[#「邦訳 加藤恵三」小見出し終わり]
[#7号][#小見出し]第一幕[#「第一幕」小見出し終わり]
[#7号][#小見出し][#ページの左右中央]終戦前夜の市街戦[#「終戦前夜の市街戦」ページの左右中央][#「終戦前夜の市街戦」小見出し終わり]
[#7号][#小見出し]第二幕[#「第二幕」小見出し終わり]
[#7号][#小見出し][#ページの左右中央]トロイヤ戦争はあったか否か[#「トロイヤ戦争はあったか否か」ページの左右中央][#「トロイヤ
戦争はあったか否か」小見出し終わり]
[#7号][#小見出し]第三幕[#「第三幕」小見出し終わり]
[#7号][#小見出し][#ページの左右中央]千年後のトロイヤ戦争[#「千年後のトロイヤ戦争」ページの左右中央][#「千年後のトロイヤ戦争」小見出し終わり]
[#7号][#小見出し][#ページの左右中央]あとがき[#「あとがき」ページの左右中央][#「あとがき」小見出し終わり]
[#改ページ][#7号][#小見出し]トロイ戦争はことごとく嘘である[#「トロイ戦争はことごとく嘘である」小見出し終わり]
[#3号][#小見出し]ジャン・ジラウドゥ[#「ジャン・ジラウドゥ」小見出し終わり]
[#7号][#小見出し]原題 LA GUERRE DE TROIE N'AURA PAS LIEUE[#「原題 LA GUERRE DE TROIE N'AURA PAS LIEUE」小見出し終わり]
[#3号][#小見出し]邦訳 加藤恵三[#「邦訳 加藤恵三」小見出し終わり]
[#7号][#小見出し]第一幕[#「第一幕」小見出し終わり]
[#7号][#小見出し][#ページの左右中央]終戦前夜の市街戦[#「終戦前夜の市街戦」ページの左右中央][#「終戦前夜の市街戦」小見出し終わり]
[