Haskell манипулирует содержимым файла

Я студент из Португалии, и у меня есть некоторые сомнения по поводу проекта, которым я должен заниматься.

Моя конечная цель — создать pdf-каталог с помощью LaTeX, в котором хранится информация о файлах с помощью exiftool.

До сих пор мне удавалось отделять аудиофайлы от видеофайлов и сохранять информацию об их exiftool'е в файле, но это их громоздко.

Например:

======== Cartoon Battle.mp3
-ExifToolVersion=8.60
-FileName=Cartoon Battle.mp3
-Directory=.
-FileSize=4.0 MB
-FileModifyDate=2011:12:13 09:46:25+00:00
-FilePermissions=rw-rw-r--
-FileType=MP3
-MIMEType=audio/mpeg
-MPEGAudioVersion=1
-AudioLayer=3
-AudioBitrate=320 kbps
-SampleRate=48000
-ChannelMode=Stereo
-MSStereo=Off
-IntensityStereo=Off
-CopyrightFlag=False
-OriginalMedia=False
-Emphasis=None
-ID3Size=113441
-Title=Cartoon Battle
-Artist=Kevin MacLeod
-Year=2007
-BeatsPerMinute=130
-Genre=Unclassifiable
-Comment=(iTunPGAP) 0
-EncodedBy=iTunes v7.0.2.16
-Comment=(iTunNORM)  000001F7 0000014B 00001DBD 00000B18 000154C8 00000780 00008169                 00008180 00000780 00000780
-Comment=(iTunSMPB)  00000000 00000210 00000A84 00000000004A606C 00000000 003DE780 00000000 00000000 00000000 00000000 00000000 00000000
-Album=Far East
-Composer=Kevin MacLeod
-PictureFormat=JPG
-PictureType=Other
-PictureDescription=
-Picture=(Binary data 91855 bytes, use -b option to extract)
-DateTimeOriginal=2007
-Duration=0:01:41 (approx)
======== Comic Plodding.mp3
-ExifToolVersion=8.60
-FileName=Comic Plodding.mp3
-Directory=.
-FileSize=3.8 MB
-FileModifyDate=2011:12:13 09:46:24+00:00
-FilePermissions=rw-rw-r--
-FileType=MP3
-MIMEType=audio/mpeg
-MPEGAudioVersion=1
-AudioLayer=3
-AudioBitrate=320 kbps
-SampleRate=44100
-ChannelMode=Joint Stereo
-MSStereo=Off
-IntensityStereo=Off
-CopyrightFlag=False
-OriginalMedia=False
-Emphasis=None
-ID3Size=105099
-EncoderSettings=Logic Pro 8.0.1
-Comment=(iTunNORM)  000001AE 00000181 000026DF 0000365B 0001100A 00016CE5 00007D33     00007ECF 00010FF0 00016CE5
-Comment=(iTunSMPB)  00000000 00000210 000009D6 000000000040DA1A 00000000 003ABCBC     00000000 00000000 00000000 00000000 00000000 00000000
-Artist=Kevin MacLeod
-Composer=Kevin MacLeod
-Year=2008
-Genre=Silent Film Score
-PictureFormat=JPG
-PictureType=Other
-PictureDescription=
-Picture=(Binary data 84880 bytes, use -b option to extract)
-Album=Scoring - Silent Film: Dark
-DateTimeOriginal=2008
-Duration=0:01:36 (approx)

Что я хотел бы сделать, так это: во-первых, попытаться разделить две песни в этом файле на какой-то список. затем попробуйте получить некоторую информацию внутри файла, например имя файла, размер и все такое.

До сих пор я придумал этот фрагмент кода, но он неверен:

mymain = do{
  a <- readFile "audio.txt" ; -- file that has all the infos collected by exiftool
  ml <- splitRegex (mkRegex "========") a ; -- I expect this to separate each song and place their corresponding information on a single string

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

Спасибо за помощь и извините за мой плохой французский!

PS: я не привык к haskell (только начинаю)


person Nuno Ferreira    schedule 14.12.2011    source источник
comment
Можете ли вы сказать нам, что происходит не так?   -  person Marcin    schedule 14.12.2011


Ответы (1)


Минимальное исправление:

import Text.Regex

main = do {
  a <- readFile "audio.txt" ;
  print $ splitRegex (mkRegex "========") a ;
}

Стрелка извлекает значение из монадического значения — из значения типа m a, где m — монада, а a — произвольный тип. readFile возвращает монадическое значение (типа IO String), а splitRegex принимает простое значение типа String. Таким образом, стрелку можно использовать для извлечения String из IO String. Но splitRegex возвращает немонадное значение, поэтому <- не может ничего извлечь из него.

Я предлагаю разделить ваш код на код ввода-вывода и код без ввода-вывода и использовать синтаксис без ; и {}:

import Text.Regex

processData text = x where
  x = splitRegex (mkRegex "========") y
  y = text
  ...

main = do
  a <- readFile "audio.txt"
  print $ processData a

Таким образом, код ввода-вывода будет использовать do и <-, а код без ввода-вывода будет использовать where и =.

person nponeccop    schedule 14.12.2011