Skip to content

Commit 569ef70

Browse files
authored
Merge pull request #835 from Kotlin/empty-csv-fix
Empty csv fix
2 parents b95b767 + 6f93a47 commit 569ef70

File tree

3 files changed

+38
-4
lines changed
  • core/src
    • main/kotlin/org/jetbrains/kotlinx/dataframe/io
    • test/kotlin/org/jetbrains/kotlinx/dataframe/io
  • plugins/dataframe-gradle-plugin/src/test/kotlin/org/jetbrains/dataframe/gradle

3 files changed

+38
-4
lines changed

core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/csv.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ public fun DataFrame.Companion.readDelim(
345345
}
346346

347347
val columnNames = csvParser.headerNames.takeIf { it.isNotEmpty() }
348-
?: (1..records[0].count()).map { index -> "X$index" }
348+
?: (1..(records.firstOrNull()?.count() ?: 0)).map { index -> "X$index" }
349349

350350
val generator = ColumnNameGenerator()
351351
val uniqueNames = columnNames.map { generator.addUnique(it) }

core/src/test/kotlin/org/jetbrains/kotlinx/dataframe/io/CsvTests.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import org.jetbrains.kotlinx.dataframe.api.dataFrameOf
1313
import org.jetbrains.kotlinx.dataframe.api.group
1414
import org.jetbrains.kotlinx.dataframe.api.groupBy
1515
import org.jetbrains.kotlinx.dataframe.api.into
16+
import org.jetbrains.kotlinx.dataframe.api.isEmpty
1617
import org.jetbrains.kotlinx.dataframe.api.schema
1718
import org.jetbrains.kotlinx.dataframe.api.toStr
1819
import org.jetbrains.kotlinx.dataframe.ncol
@@ -282,6 +283,40 @@ class CsvTests {
282283
df.columnNames() shouldBe listOf("Column1", "Column2")
283284
}
284285

286+
@Test
287+
fun `read empty delimStr or CSV`() {
288+
val emptyDelimStr = DataFrame.readDelimStr("")
289+
emptyDelimStr shouldBe DataFrame.empty()
290+
291+
val emptyDelimFile = DataFrame.readDelim(File.createTempFile("empty", "csv").reader())
292+
emptyDelimFile shouldBe DataFrame.empty()
293+
294+
val emptyCsvFile = DataFrame.readCSV(File.createTempFile("empty", "csv"))
295+
emptyCsvFile shouldBe DataFrame.empty()
296+
297+
val emptyCsvFileManualHeader = DataFrame.readCSV(
298+
file = File.createTempFile("empty", "csv"),
299+
header = listOf("a", "b", "c"),
300+
)
301+
emptyCsvFileManualHeader.apply {
302+
isEmpty() shouldBe true
303+
columnNames() shouldBe listOf("a", "b", "c")
304+
columnTypes() shouldBe listOf(typeOf<String>(), typeOf<String>(), typeOf<String>())
305+
}
306+
307+
val emptyCsvFileWithHeader = DataFrame.readCSV(
308+
file = File.createTempFile("empty", "csv").also { it.writeText("a,b,c") },
309+
)
310+
emptyCsvFileWithHeader.apply {
311+
isEmpty() shouldBe true
312+
columnNames() shouldBe listOf("a", "b", "c")
313+
columnTypes() shouldBe listOf(typeOf<String>(), typeOf<String>(), typeOf<String>())
314+
}
315+
316+
val emptyTsvStr = DataFrame.readTSV(File.createTempFile("empty", "tsv"))
317+
emptyTsvStr shouldBe DataFrame.empty()
318+
}
319+
285320
companion object {
286321
private val simpleCsv = testCsv("testCSV")
287322
private val csvWithFrenchLocale = testCsv("testCSVwithFrenchLocale")

plugins/dataframe-gradle-plugin/src/test/kotlin/org/jetbrains/dataframe/gradle/DataFrameReadTest.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import io.kotest.assertions.throwables.shouldThrowAny
77
import io.kotest.matchers.shouldBe
88
import kotlinx.serialization.SerializationException
99
import org.jetbrains.kotlinx.dataframe.DataFrame
10+
import org.jetbrains.kotlinx.dataframe.api.isEmpty
1011
import org.jetbrains.kotlinx.dataframe.io.read
1112
import org.jetbrains.kotlinx.dataframe.io.readSqlTable
1213
import org.junit.Test
@@ -42,9 +43,7 @@ class DataFrameReadTest {
4243
fun `file with invalid csv`() {
4344
val temp = Files.createTempDirectory("").toFile()
4445
val invalidCsv = File(temp, "test.csv").also { it.writeText("") }
45-
shouldThrow<IndexOutOfBoundsException> {
46-
DataFrame.read(invalidCsv)
47-
}
46+
DataFrame.read(invalidCsv).isEmpty() shouldBe true
4847
}
4948

5049
@Test

0 commit comments

Comments
 (0)