diff --git a/src/Gargantext/API/Node/FrameCalcUpload.hs b/src/Gargantext/API/Node/FrameCalcUpload.hs
index 1b877e35247f856f19c26d148a85c6b7fecdb89f..2f44d770284d3d519aa7612007d9d13c4a37ab22 100644
--- a/src/Gargantext/API/Node/FrameCalcUpload.hs
+++ b/src/Gargantext/API/Node/FrameCalcUpload.hs
@@ -80,6 +80,7 @@ frameCalcUploadAsync uId nId _f logStatus jobLog = do
     httpLbs req manager
   let body = T.pack $ BSU8.toString $ BSL.toStrict $ responseBody res
 
+  -- printDebug "body" body
   mCId <- getClosestParentIdByType nId NodeCorpus
   -- printDebug "[frameCalcUploadAsync] mCId" mCId
 
diff --git a/src/Gargantext/Core/Ext/IMTUser.hs b/src/Gargantext/Core/Ext/IMTUser.hs
index 058221f8a15a80e3f1b16bbfa1886c5afb0359f3..ec2900cf59089e6bbbe26f10eb3e72de3a835620 100644
--- a/src/Gargantext/Core/Ext/IMTUser.hs
+++ b/src/Gargantext/Core/Ext/IMTUser.hs
@@ -123,7 +123,7 @@ readCSVFile_Annuaire' :: FilePath -> IO (Header, Vector IMTUser)
 readCSVFile_Annuaire' = fmap readCsvHalLazyBS' . BL.readFile
   where
     readCsvHalLazyBS' :: BL.ByteString -> (Header, Vector IMTUser)
-    readCsvHalLazyBS' bs = case decodeByNameWith csvDecodeOptions bs of
+    readCsvHalLazyBS' bs = case decodeByNameWith (csvDecodeOptions Tab) bs of
           Left  e    -> panic (cs e)
           Right rows -> rows
 
diff --git a/src/Gargantext/Core/Text/Corpus/Parsers/CSV.hs b/src/Gargantext/Core/Text/Corpus/Parsers/CSV.hs
index ecf53b55fb50fd64daa03edd489d25a296eda03c..f009e703b6604e1f47d59f323f2d92fee34a6fbf 100644
--- a/src/Gargantext/Core/Text/Corpus/Parsers/CSV.hs
+++ b/src/Gargantext/Core/Text/Corpus/Parsers/CSV.hs
@@ -218,14 +218,17 @@ hyperdataDocument2csvDoc h = CsvDoc { csv_title = m $ _hd_title h
     mI = maybe 0 identity
 
 
-csvDecodeOptions :: DecodeOptions
-csvDecodeOptions = defaultDecodeOptions {decDelimiter = delimiter}
+data Delimiter = Tab | Comma
 
-csvEncodeOptions :: EncodeOptions
-csvEncodeOptions = defaultEncodeOptions {encDelimiter = delimiter}
+csvDecodeOptions :: Delimiter -> DecodeOptions
+csvDecodeOptions d = defaultDecodeOptions {decDelimiter = delimiter d}
 
-delimiter :: Word8
-delimiter = fromIntegral $ ord '\t'
+csvEncodeOptions :: Delimiter -> EncodeOptions
+csvEncodeOptions d = defaultEncodeOptions {encDelimiter = delimiter d}
+
+delimiter :: Delimiter -> Word8
+delimiter Tab   = fromIntegral $ ord '\t'
+delimiter Comma = fromIntegral $ ord ','
 ------------------------------------------------------------------------
 ------------------------------------------------------------------------
 readCsvOn' :: [CsvDoc -> Text] -> FilePath -> IO (Either Prelude.String [Text])
@@ -237,27 +240,44 @@ readCsvOn' fields fp = do
 
 ------------------------------------------------------------------------
 
-readFileLazy :: (FromNamedRecord a) => proxy a -> FilePath -> IO (Either Prelude.String (Header, Vector a))
-readFileLazy f = fmap (readByteStringLazy f) . BL.readFile
-
-readFileStrict :: (FromNamedRecord a) => proxy a -> FilePath -> IO (Either Prelude.String (Header, Vector a))
-readFileStrict f = fmap (readByteStringStrict f) . BS.readFile
-
-readByteStringLazy :: (FromNamedRecord a) => proxy a -> BL.ByteString -> Either Prelude.String (Header, Vector a)
-readByteStringLazy _f bs = decodeByNameWith csvDecodeOptions bs
-
-readByteStringStrict :: (FromNamedRecord a) => proxy a -> BS.ByteString -> Either Prelude.String (Header, Vector a)
-readByteStringStrict ff = (readByteStringLazy ff) . BL.fromStrict
+readFileLazy :: (FromNamedRecord a) => proxy a -> Delimiter -> FilePath -> IO (Either Prelude.String (Header, Vector a))
+readFileLazy d f = fmap (readByteStringLazy d f) . BL.readFile
+
+readFileStrict :: (FromNamedRecord a)
+               => proxy a
+               -> Delimiter
+               -> FilePath
+               -> IO (Either Prelude.String (Header, Vector a))
+readFileStrict d f = fmap (readByteStringStrict d f) . BS.readFile
+
+readByteStringLazy :: (FromNamedRecord a)
+                   => proxy a
+                   -> Delimiter
+                   -> BL.ByteString
+                   -> Either Prelude.String (Header, Vector a)
+readByteStringLazy _f d bs = decodeByNameWith (csvDecodeOptions d) bs
+
+readByteStringStrict :: (FromNamedRecord a)
+                     => proxy a
+                     -> Delimiter
+                     -> BS.ByteString
+                     -> Either Prelude.String (Header, Vector a)
+readByteStringStrict d ff = (readByteStringLazy d ff) . BL.fromStrict
 
 ------------------------------------------------------------------------
 -- | TODO use readFileLazy
 readFile :: FilePath -> IO (Either Prelude.String (Header, Vector CsvDoc))
-readFile = fmap readCsvLazyBS . BL.readFile
+readFile fp = do
+  result <- fmap (readCsvLazyBS Comma) $ BL.readFile fp
+  case result of
+    Left _err -> fmap (readCsvLazyBS Tab) $ BL.readFile fp
+    Right res -> pure $ Right res
+
 
 
 -- | TODO use readByteStringLazy
-readCsvLazyBS :: BL.ByteString -> Either Prelude.String (Header, Vector CsvDoc)
-readCsvLazyBS bs = decodeByNameWith csvDecodeOptions bs
+readCsvLazyBS :: Delimiter -> BL.ByteString -> Either Prelude.String (Header, Vector CsvDoc)
+readCsvLazyBS d bs = decodeByNameWith (csvDecodeOptions d) bs
 
 ------------------------------------------------------------------------
 -- | TODO use readFileLazy
@@ -266,7 +286,7 @@ readCsvHal = fmap readCsvHalLazyBS . BL.readFile
 
 -- | TODO use readByteStringLazy
 readCsvHalLazyBS :: BL.ByteString -> Either Prelude.String (Header, Vector CsvHal)
-readCsvHalLazyBS bs = decodeByNameWith csvDecodeOptions bs
+readCsvHalLazyBS bs = decodeByNameWith (csvDecodeOptions Tab) bs
 
 readCsvHalBSStrict :: BS.ByteString -> Either Prelude.String (Header, Vector CsvHal)
 readCsvHalBSStrict = readCsvHalLazyBS . BL.fromStrict
@@ -274,13 +294,13 @@ readCsvHalBSStrict = readCsvHalLazyBS . BL.fromStrict
 ------------------------------------------------------------------------
 writeFile :: FilePath -> (Header, Vector CsvDoc) -> IO ()
 writeFile fp (h, vs) = BL.writeFile fp $
-                      encodeByNameWith csvEncodeOptions h (V.toList vs)
+                      encodeByNameWith (csvEncodeOptions Tab) h (V.toList vs)
 
 writeDocs2Csv :: FilePath -> [HyperdataDocument] -> IO ()
 writeDocs2Csv fp hs = BL.writeFile fp $ hyperdataDocument2csv hs
 
 hyperdataDocument2csv :: [HyperdataDocument] -> BL.ByteString
-hyperdataDocument2csv hs = encodeByNameWith csvEncodeOptions headerCsvGargV3 (map hyperdataDocument2csvDoc hs)
+hyperdataDocument2csv hs = encodeByNameWith (csvEncodeOptions Tab) headerCsvGargV3 (map hyperdataDocument2csvDoc hs)
 
 ------------------------------------------------------------------------
 -- Hal Format
@@ -425,13 +445,22 @@ parseHal' :: BL.ByteString -> Either Prelude.String [HyperdataDocument]
 parseHal' bs = (V.toList . V.map csvHal2doc . snd) <$> readCsvHalLazyBS bs
 
 ------------------------------------------------------------------------
+
 parseCsv :: FilePath -> IO (Either Prelude.String [HyperdataDocument])
-parseCsv fp = do
-  r <- readFile fp
-  pure $ (V.toList . V.map csv2doc . snd) <$> r
+parseCsv fp = fmap (V.toList . V.map csv2doc . snd) <$> readFile fp
+
+{-
+parseCsv' ::  BL.ByteString -> Either Prelude.String [HyperdataDocument]
+parseCsv' bs = (V.toList . V.map csv2doc . snd) <$> readCsvLazyBS Comma bs
+-}
 
 parseCsv' :: BL.ByteString -> Either Prelude.String [HyperdataDocument]
-parseCsv' bs = (V.toList . V.map csv2doc . snd) <$> readCsvLazyBS bs
+parseCsv' bs = do
+  let
+    result = case readCsvLazyBS Comma bs of
+      Left  _err -> readCsvLazyBS Tab bs
+      Right res -> Right res
+  (V.toList . V.map csv2doc . snd) <$> result
 
 ------------------------------------------------------------------------
 -- Csv v3 weighted for phylo
@@ -460,9 +489,9 @@ instance FromNamedRecord Csv' where
     pure $ Csv' { .. }
 
 readWeightedCsv :: FilePath -> IO (Header, Vector Csv')
-readWeightedCsv fp = 
-  fmap (\bs -> 
-    case decodeByNameWith csvDecodeOptions bs of
+readWeightedCsv fp =
+  fmap (\bs ->
+    case decodeByNameWith (csvDecodeOptions Tab) bs of
       Left e       -> panic (pack e)
       Right corpus -> corpus
     ) $ BL.readFile fp