2011-12-14 4 views
4

Я ученик из Португалии, имеющий некоторые сомнения в отношении проекта, с которым мне приходится обращаться.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) 

Что я хотел бы сделать, это: первых, попытайтесь разделить две песни на этом файле в каком-то списке какой-то. , попробуйте взять часть информации внутри файла, например 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 (только начиная)

+3

Не могли бы вы рассказать нам, что не так? – Marcin

ответ

6

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

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 возвращает не монадическое значение, поэтому <- не может извлечь из него ничего.

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

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 и =.

Смежные вопросы