05/10/10 09:43:14
>>183
茨の道ですよ。多分。
//CallWithInputFile 使い方 (22行)
strStr:: !String !String !Int -> (String, Int)
strStr str1 str2 p=lp p 0
where n = size str1
m = size str2
lp i j| j == m = (str1 %(p,i-m-1) , i-m)
| i == n = (str1 %(p,i-1) , i)
| str1.[i] == str2.[j] = lp (i+1) (j+1)
= lp (i+1) j
stringSplit s c :== reverse (stringSplitAcc s c 0 [])
stringSplitAcc:: !String !String !Int ![String] -> [String]
stringSplitAcc str del i ret
| p==(size str) =[match:ret]
= stringSplitAcc str del (p+1) [match:ret]
where (match,p) = strStr str del i
readCsv line knil :== [stringSplit line ",": knil]
csvReader:: !*File -> ([[String]] , *File)
csvReader file# (s,file) = foldWithReadline readCsv [] file
= (reverse s, file)
errorFunc:: String *fs -> ([[String]], *fs) | FileSystem fs
errorFunc mes files= abort mes
Start:: *World -> ([[String]],*World)
Start world =CallWithInputFile "test.txt" (errorFunc "error") csvReader world