diff --git a/htiled.cabal b/htiled.cabal
--- a/htiled.cabal
+++ b/htiled.cabal
@@ -1,5 +1,5 @@
 Name:                htiled
-Version:             0.1.1.1
+Version:             0.1.1.2
 Synopsis:            Import from the Tiled map editor.
 Description:         Import maps from the .tmx map format generated by Tiled,
                      <http://www.mapeditor.org>.
@@ -20,5 +20,5 @@
   Exposed-Modules:   Data.Tiled, Data.Tiled.Types, Data.Tiled.Load
   Build-depends:       base ==4.*, zlib ==0.5.*, bytestring
                      , hxt == 9.*, base64-bytestring > 1
-                     , containers >=0.4 && <0.6, filepath
+                     , containers >=0.4 && <0.6, filepath, split
   Ghc-Options:       -Wall
diff --git a/src/Data/Tiled/Load.hs b/src/Data/Tiled/Load.hs
--- a/src/Data/Tiled/Load.hs
+++ b/src/Data/Tiled/Load.hs
@@ -1,23 +1,26 @@
-{-# LANGUAGE Arrows, UnicodeSyntax, RecordWildCards #-}
+{-# LANGUAGE Arrows          #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE UnicodeSyntax   #-}
 module Data.Tiled.Load (loadMapFile, loadMap) where
 
-import Prelude hiding ((.), id)
-import Control.Category ((.), id)
-import Data.Bits (testBit, clearBit)
-import qualified Data.ByteString.Base64 as B64
-import qualified Data.ByteString.Char8 as BS
+import           Control.Category           (id, (.))
+import           Data.Bits                  (clearBit, testBit)
+import qualified Data.ByteString.Base64     as B64
+import qualified Data.ByteString.Char8      as BS
 import qualified Data.ByteString.Lazy.Char8 as LBS
-import Data.Char (digitToInt)
-import Data.List (sort)
-import Data.Map (fromDistinctAscList, Map)
-import Data.Maybe (listToMaybe, fromMaybe, isNothing)
-import Data.Word (Word32)
+import           Data.Char                  (digitToInt)
+import           Data.List                  (sort)
+import           Data.List.Split            (splitOn)
+import           Data.Map                   (Map, fromDistinctAscList)
+import           Data.Maybe                 (fromMaybe, isNothing, listToMaybe)
+import           Data.Word                  (Word32)
+import           Prelude                    hiding (id, (.))
 
-import qualified Codec.Compression.GZip as GZip
-import qualified Codec.Compression.Zlib as Zlib
-import Text.XML.HXT.Core
+import qualified Codec.Compression.GZip     as GZip
+import qualified Codec.Compression.Zlib     as Zlib
+import           Text.XML.HXT.Core
 
-import Data.Tiled.Types
+import           Data.Tiled.Types
 
 -- | Load a map from a string
 loadMap ∷ String → IO TiledMap
@@ -116,24 +119,32 @@
     dataToTiles ∷ Int → Int → String → String → String → Map (Int, Int) Tile
     dataToTiles w h "base64" "gzip" = toMap w h . base64 GZip.decompress
     dataToTiles w h "base64" "zlib" = toMap w h . base64 Zlib.decompress
-    dataToTiles _ _ _ _ = error "unsupported tile data format, only base64 and \
-                                \gzip/zlib is supported at the moment."
+    dataToTiles w h "csv"    _      = toMap w h . csv
+    dataToTiles _ _ _ _ = error "unsupported tile data format, only base64 with \
+                                \gzip/zlib and csv are supported at the moment."
 
     toMap w h = fromDistinctAscList . sort . filter (\(_, x) → tileGid x /= 0)
                 . zip [(x, y) | y ← [0..h-1], x ← [0..w-1]]
 
-    base64 f = bytesToTiles . LBS.unpack . f . LBS.fromChunks
+    base64 f = wordsToTiles . bytesToWords . LBS.unpack . f . LBS.fromChunks
                             . (:[]) . B64.decodeLenient . BS.pack
 
-    bytesToTiles (a:b:c:d:xs) = Tile { .. } : bytesToTiles xs
+    csv = wordsToTiles . map (read ∷ String → Word32)
+                       . splitOn ","
+                       . filter (`elem` (',':['0' .. '9']))
+
+    bytesToWords []           = []
+    bytesToWords (a:b:c:d:xs) = n : bytesToWords xs
       where n = f a + f b * 256 + f c * 65536 + f d * 16777216
             f = fromIntegral . fromEnum ∷ Char → Word32
-            tileGid = n `clearBit` 30 `clearBit` 31 `clearBit` 29
-            tileIsVFlipped = n `testBit` 30
-            tileIsHFlipped = n `testBit` 31
-            tileIsDiagFlipped = n `testBit` 29
-    bytesToTiles [] = []
-    bytesToTiles _ = error "number of bytes not a multiple of 4."
+    bytesToWords _            = error "number of bytes not a multiple of 4."
+
+    wordsToTiles []           = []
+    wordsToTiles (w:ws)       = Tile { .. } : wordsToTiles ws
+      where tileGid           = w `clearBit` 30 `clearBit` 31 `clearBit` 29
+            tileIsVFlipped    = w `testBit` 30
+            tileIsHFlipped    = w `testBit` 31
+            tileIsDiagFlipped = w `testBit` 29
 
     common = proc (l, x) → do
         layerName       ← getAttrValue "name"              ⤙ l
