Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7554769
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 30, 20262026-05-30T11:25:41+00:00 2026-05-30T11:25:41+00:00

I did picked csv-enumerator package for parsing large amount of CSV files task. Input

  • 0

I did picked csv-enumerator package for parsing large amount of CSV files task.
Input files do contain headers so map type was chosen for row representing. MapRow which is alias to Data.Map ByteString ByteString, to be concrete.

The issue is with map is automatically sorted by keys(column names) deep inside csv-enumerator code – in localy-scoped toMapCSV function using Data.Map.fromList that does sort elements by keys, so simple monkey-patch is not possible.

I’d need to keep columns order for output CSVs.
Unfortunaly my current solution is rather complicated, ie. read header separately and reorder once read MapRow:

import Data.CSV.Enumerator
import qualified Data.Map as M
import Data.Either
import Control.Monad
...
csvMode = CSVS { csvSep = ';'
               , csvQuoteChar = Just '"'
               , csvOutputQuoteChar = Just '"'
               , csvOutputColSep = ';'
               }
...
updateCSV :: FilePath -> IO (Either SomeException Int)
updateCSV fn = do
  ...
  csv <- readCSVFile csvMode fn >>= return . (either (const []) (id :: [MapRow]->[MapRow]))
  hdr <- readCSVFile csvMode fn >>= return . head .(either (const []) (id :: [Row]->[Row]))
  ...
  -- reorder MapRow
  outMapRow=M.fromAscList $ map (\k -> (k, (M.!) (head csv) k)) hdr
  ...
  • is there a more simple way how to keep columns order of an original CSV file ?
  • altering csv-enumerator sources is not an option
  • I’d like to mention in real code the input csv file is processed by foldCSVFile, ie. “row by row” besides haskell’s laziness
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-30T11:25:43+00:00Added an answer on May 30, 2026 at 11:25 am

    As there is no more complete CSV parsing module than csv-enumerator and Data.Map used for row representation loses original order of columns I had to use association list instead and implement custom functions for element updating, conversion between assoc. list and plain list etc. Fortunately standard Data.List (GHC.List respectively) does contain lookup and zip/unzip functions at least.

    1. first line of csv file is extracted from IO action once

      header <- readCSVFile … >>= return . head …

    2. contents of csv file is parsed with foldCSVFile

      linesCount <- foldCSVFile … (funToIterIO …) 0

    3. iterative function uses assoc list [(Field, Field)] converted from Row and converts back before writing to output file

      let assocRow = zip header …

      let updatedARow = adjust trans “Column name” assocRow

      — write updated values

      outputRow … $ foldr ((:) . snd) [] updatedARow

    All works as expected now although more code had to be written and more time was consumed 🙁

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

We recently attempted a large, cherry picked merge. First we did a full merge
Did you know that : Map<Object,Object> m1 = new HashMap<Object, Object>(); Map<Object,Object> m2 =
Did you ever have to choose between WISA or LAMP at the beginning of
Did you ever had a bug in your code, you could not resolve? I
Did anyone of you ever find a way of getting the Microsoft Report Viewer
Did you ever use Oracle auditing features on a production db? How did that
Did Microsoft abandon support for Windows Presentation Foundation (WPF) on Visual Studio 2005? There
Did the recent purchase of MySQL by Sun and the subsequent buggy releases kill
Did anyone try that feature and has some feedback? Or Does anyone know some
Did anyone try to read programmatically an Alibre Design CAD file? I see that

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.