Haskell манипулирует содержимым файла - PullRequest
4 голосов
/ 14 декабря 2011

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

Моя конечная цель - создать каталог PDF с LaTeX, который будет хранить информацию о файлах с использованием exiftool.1004 * До сих пор мне удалось отделить аудио от видеофайлов и сохранить их 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)

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

Пока что я пришел с этим фрагментом кода, но это неверно:

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 (только начинаю)

1 Ответ

6 голосов
/ 14 декабря 2011

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

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

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

...