diff --git a/Cargo.toml b/Cargo.toml
index 57c3509cfc34cd61cb0d61615e25e404df08abdf..5ae5d7600afe0aceb450ab6a6b9d2f3b17138352 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 
 name = "tiled"
-version = "0.9.4"
+version = "0.9.5"
 description = "A rust crate for loading in maps created by the Tiled editor"
 repository = "https://github.com/mattyhall/rs-tiled.git"
 # documentation = "http://rust-ci.org/mattyhall/rs-tiled/doc/tiled/"
diff --git a/assets/ldk_tiled_export.tmx b/assets/ldk_tiled_export.tmx
new file mode 100644
index 0000000000000000000000000000000000000000..b14ed139dfb6a08f1df3b03b0d7c213169934b4b
--- /dev/null
+++ b/assets/ldk_tiled_export.tmx
@@ -0,0 +1,8 @@
+<map version="1.4" tiledversion="1.4.2" orientation="orthogonal" renderorder="right-down" compressionlevel="0" width="8" height="8" tilewidth="32" tileheight="32" infinite="0" backgroundcolor="#696A79" nextlayerid="2" nextobjectid="1">
+    <tileset firstgid="1" name="Tilesheet" tilewidth="32" tileheight="32" tilecount="84" columns="14" objectalignment="topleft" margin="0" spacing="0">
+        <image source="tilesheet.png" width="448" height="192"/>
+    </tileset>
+    <layer id="1" name="Tiles" width="8" height="8" opacity="1">
+        <data encoding="csv">0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,47,1,1,0,0,0,0,47,47,0,0,0,0,0,0,47,47,0,0,0,0,0,0,0,0,47,0,0,0,0,0,0,0,0,0,0,0,0</data>
+    </layer>
+</map>
\ No newline at end of file
diff --git a/src/lib.rs b/src/lib.rs
index 9f3490cb7ee95b1511934c0184ef295607d74f13..33364a369526de0613d013ed1943304d61590235 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1140,7 +1140,7 @@ fn parse_data_line<R: Read>(
         }
         (Some(e), None) => match e.as_ref() {
             "base64" => return parse_base64(parser).map(|v| convert_to_tile(&v, width)),
-            "csv" => return decode_csv(parser),
+            "csv" => return decode_csv(width, parser),
             e => return Err(TiledError::Other(format!("Unknown encoding format {}", e))),
         },
         (Some(e), Some(c)) => match (e.as_ref(), c.as_ref()) {
@@ -1224,22 +1224,20 @@ fn decode_zstd(data: Vec<u8>) -> Result<Vec<u8>, TiledError> {
     Ok(data)
 }
 
-fn decode_csv<R: Read>(parser: &mut EventReader<R>) -> Result<Vec<Vec<LayerTile>>, TiledError> {
+fn decode_csv<R: Read>(width: u32, parser: &mut EventReader<R>) -> Result<Vec<Vec<LayerTile>>, TiledError> {
     loop {
         match parser.next().map_err(TiledError::XmlDecodingError)? {
             XmlEvent::Characters(s) => {
-                let mut rows: Vec<Vec<LayerTile>> = Vec::new();
-                for row in s.split('\n') {
-                    if row.trim() == "" {
-                        continue;
-                    }
-                    rows.push(
-                        row.split(',')
-                            .filter(|v| v.trim() != "")
-                            .map(|v| v.replace('\r', "").parse().unwrap())
-                            .map(|id| LayerTile::new(id))
-                            .collect(),
-                    );
+                let mut tiles_it = s
+                    .split(&['\n', '\r', ','][0..])
+                    .filter(|v| v.trim() != "")
+                    .map(|v| v.parse().unwrap())
+                    .map(LayerTile::new)
+                    .peekable();
+                let mut rows = Vec::new();
+                while tiles_it.peek().is_some() {
+                    let row = tiles_it.by_ref().take(width as usize).collect();
+                    rows.push(row);
                 }
                 return Ok(rows);
             }
diff --git a/tests/lib.rs b/tests/lib.rs
index 957fa8e2c9cd9819bf8d54081e73d8666385c4d5..80ab40b843c5d062166383073ea7ec0ba24701bf 100644
--- a/tests/lib.rs
+++ b/tests/lib.rs
@@ -20,6 +20,19 @@ fn test_gzip_and_zlib_encoded_and_raw_are_the_same() {
     assert_eq!(z, g);
     assert_eq!(z, r);
     assert_eq!(z, c);
+    
+    if let LayerData::Finite(tiles) = &c.layers[0].tiles {
+        assert_eq!(tiles.len(), 100);
+        assert_eq!(tiles[0].len(), 100);
+        assert_eq!(tiles[99].len(), 100);
+        assert_eq!(tiles[0][0].gid, 35);
+        assert_eq!(tiles[1][0].gid, 17);
+        assert_eq!(tiles[2][0].gid, 0);
+        assert_eq!(tiles[2][1].gid, 17);
+        assert!(tiles[99].iter().map(|t| t.gid).all(|g| g == 0));
+    } else {
+        assert!(false, "It is wrongly recognised as an infinite map");
+    }
 }
 
 #[test]
@@ -49,7 +62,7 @@ fn test_infinite_tileset() {
         assert_eq!(chunks[&(0, 32)].height, 32);
         assert_eq!(chunks[&(-32, 32)].height, 32);
     } else {
-        assert!(false, "It is wrongly recognized as a finite map");
+        assert!(false, "It is wrongly recognised as a finite map");
 
     }
 }
@@ -144,7 +157,20 @@ fn test_flipped_gid() {
         assert!(!t4.flip_h);
         assert!(!t4.flip_v);
     } else {
-        assert!(false, "It is wrongly recognized as an infinite map");
+        assert!(false, "It is wrongly recognised as an infinite map");
     }
     
 }
+
+#[test]
+fn test_ldk_export() {
+    let r = read_from_file_with_path(&Path::new("assets/ldk_tiled_export.tmx")).unwrap();
+    if let LayerData::Finite(tiles) = &r.layers[0].tiles {
+        assert_eq!(tiles.len(), 8);
+        assert_eq!(tiles[0].len(), 8);
+        assert_eq!(tiles[0][0].gid, 0);
+        assert_eq!(tiles[1][0].gid, 1);
+    } else {
+        assert!(false, "It is wrongly recognised as an infinite map");
+    }
+}
\ No newline at end of file