csv: don't count fields in skipped lines (fixes #177)
This commit is contained in:
		
							parent
							
								
									07a82724ed
								
							
						
					
					
						commit
						dfbe801fbc
					
				| @ -83,17 +83,9 @@ readJournalFromCsv mrulesfile csvfile csvdata = | |||||||
|  handle (\e -> return $ Left $ show (e :: IOException)) $ do |  handle (\e -> return $ Left $ show (e :: IOException)) $ do | ||||||
|   let throwerr = throw.userError |   let throwerr = throw.userError | ||||||
| 
 | 
 | ||||||
|   -- parse csv |  | ||||||
|   records <- (either throwerr id . validateCsv) `fmap` parseCsv csvfile csvdata |  | ||||||
|   return $ dbg "" $ take 3 records |  | ||||||
| 
 |  | ||||||
|   -- identify header lines |  | ||||||
|   -- let (headerlines, datalines) = identifyHeaderLines records |  | ||||||
|   --     mfieldnames = lastMay headerlines |  | ||||||
| 
 |  | ||||||
|   -- parse rules |   -- parse rules | ||||||
|   let rulesfile = fromMaybe (rulesFileFor csvfile) mrulesfile |   let rulesfile = fromMaybe (rulesFileFor csvfile) mrulesfile | ||||||
|   created <- records `seq` ensureRulesFileExists rulesfile |   created <- ensureRulesFileExists rulesfile | ||||||
|   if created |   if created | ||||||
|    then hPrintf stderr "creating default conversion rules file %s, edit this file for better results\n" rulesfile |    then hPrintf stderr "creating default conversion rules file %s, edit this file for better results\n" rulesfile | ||||||
|    else hPrintf stderr "using conversion rules file %s\n" rulesfile |    else hPrintf stderr "using conversion rules file %s\n" rulesfile | ||||||
| @ -101,14 +93,21 @@ readJournalFromCsv mrulesfile csvfile csvdata = | |||||||
|   return $ dbg "" rules |   return $ dbg "" rules | ||||||
| 
 | 
 | ||||||
|   -- apply skip directive |   -- apply skip directive | ||||||
|   let headerlines = maybe 0 oneorerror $ getDirective "skip" rules |   let skip = maybe 0 oneorerror $ getDirective "skip" rules | ||||||
|         where |         where | ||||||
|           oneorerror "" = 1 |           oneorerror "" = 1 | ||||||
|           oneorerror s  = readDef (throwerr $ "could not parse skip value: " ++ show s) s |           oneorerror s  = readDef (throwerr $ "could not parse skip value: " ++ show s) s | ||||||
|       records' = drop headerlines records | 
 | ||||||
|  |   -- parse csv | ||||||
|  |   records <- (either throwerr id . validateCsv skip) `fmap` parseCsv csvfile csvdata | ||||||
|  |   dbgAtM 1 "" $ take 3 records | ||||||
|  | 
 | ||||||
|  |   -- identify header lines | ||||||
|  |   -- let (headerlines, datalines) = identifyHeaderLines records | ||||||
|  |   --     mfieldnames = lastMay headerlines | ||||||
| 
 | 
 | ||||||
|   -- convert to transactions and return as a journal |   -- convert to transactions and return as a journal | ||||||
|   let txns = map (transactionFromCsvRecord rules) records' |   let txns = map (transactionFromCsvRecord rules) records | ||||||
|   return $ Right nulljournal{jtxns=sortBy (comparing tdate) txns} |   return $ Right nulljournal{jtxns=sortBy (comparing tdate) txns} | ||||||
| 
 | 
 | ||||||
| parseCsv :: FilePath -> String -> IO (Either ParseError CSV) | parseCsv :: FilePath -> String -> IO (Either ParseError CSV) | ||||||
| @ -118,9 +117,9 @@ parseCsv path csvdata = | |||||||
|     _   -> return $ parseCSV path csvdata |     _   -> return $ parseCSV path csvdata | ||||||
| 
 | 
 | ||||||
| -- | Return the cleaned up and validated CSV data, or an error. | -- | Return the cleaned up and validated CSV data, or an error. | ||||||
| validateCsv :: Either ParseError CSV -> Either String [CsvRecord] | validateCsv :: Int -> Either ParseError CSV -> Either String [CsvRecord] | ||||||
| validateCsv (Left e) = Left $ show e | validateCsv _ (Left e) = Left $ show e | ||||||
| validateCsv (Right rs) = validate $ filternulls rs | validateCsv numhdrlines (Right rs) = validate $ drop numhdrlines $ filternulls rs | ||||||
|   where |   where | ||||||
|     filternulls = filter (/=[""]) |     filternulls = filter (/=[""]) | ||||||
|     validate [] = Left "no CSV records found" |     validate [] = Left "no CSV records found" | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user