diff --git a/core/api/core.api b/core/api/core.api index e76e11eaba..b106a821b4 100644 --- a/core/api/core.api +++ b/core/api/core.api @@ -6310,23 +6310,31 @@ public final class org/jetbrains/kotlinx/dataframe/io/GuessKt { public static final fun read (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/io/File;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun read (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun read (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/net/URL;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public static final fun read (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/nio/file/Path;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun read (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/io/File;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static final fun read (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static final fun read (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/net/URL;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataRow; + public static final fun read (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/nio/file/Path;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static synthetic fun read$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/io/File;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun read$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun read$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/net/URL;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public static synthetic fun read$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/nio/file/Path;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun read$default (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/io/File;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static synthetic fun read$default (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static synthetic fun read$default (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/net/URL;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataRow; + public static synthetic fun read$default (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/nio/file/Path;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static final fun readDataFrame (Ljava/io/File;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readDataFrame (Ljava/net/URL;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public static final fun readDataFrame (Ljava/nio/file/Path;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readDataFrame$default (Ljava/io/File;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readDataFrame$default (Ljava/net/URL;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public static synthetic fun readDataFrame$default (Ljava/nio/file/Path;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readDataRow (Ljava/io/File;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static final fun readDataRow (Ljava/net/URL;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataRow; + public static final fun readDataRow (Ljava/nio/file/Path;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static synthetic fun readDataRow$default (Ljava/io/File;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static synthetic fun readDataRow$default (Ljava/net/URL;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataRow; + public static synthetic fun readDataRow$default (Ljava/nio/file/Path;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataRow; } public final class org/jetbrains/kotlinx/dataframe/io/HtmlKt { @@ -6394,8 +6402,10 @@ public abstract interface class org/jetbrains/kotlinx/dataframe/io/SupportedCode public abstract interface class org/jetbrains/kotlinx/dataframe/io/SupportedDataFrameFormat : org/jetbrains/kotlinx/dataframe/io/SupportedFormat { public abstract fun readDataFrame (Ljava/io/File;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public abstract fun readDataFrame (Ljava/io/InputStream;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public fun readDataFrame (Ljava/nio/file/Path;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readDataFrame$default (Lorg/jetbrains/kotlinx/dataframe/io/SupportedDataFrameFormat;Ljava/io/File;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readDataFrame$default (Lorg/jetbrains/kotlinx/dataframe/io/SupportedDataFrameFormat;Ljava/io/InputStream;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public static synthetic fun readDataFrame$default (Lorg/jetbrains/kotlinx/dataframe/io/SupportedDataFrameFormat;Ljava/nio/file/Path;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; } public abstract interface class org/jetbrains/kotlinx/dataframe/io/SupportedFormat { diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/csv.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/csv.kt index 3604b8b911..87dbecf74b 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/csv.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/csv.kt @@ -58,6 +58,7 @@ import java.math.BigInteger import java.net.URL import java.nio.charset.Charset import java.util.zip.GZIPInputStream +import java.nio.file.Path import kotlin.reflect.KClass import kotlin.reflect.KType import kotlin.reflect.typeOf @@ -73,6 +74,10 @@ public class CSV(private val delimiter: Char = ',') : SupportedDataFrameFormat { override fun readDataFrame(file: File, header: List): AnyFrame = DataFrame.readCSV(file = file, delimiter = delimiter, header = header) + override fun readDataFrame(path: Path, header: List): AnyFrame = + // core CSV impl is deprecated, delegate via File to preserve module boundaries + DataFrame.readCSV(file = path.toFile(), delimiter = delimiter, header = header) + override fun acceptsExtension(ext: String): Boolean = ext == "csv" override fun acceptsSample(sample: SupportedFormatSample): Boolean = true // Extension is enough diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/guess.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/guess.kt index 527b0a639b..5a79378b72 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/guess.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/guess.kt @@ -16,7 +16,9 @@ import java.io.File import java.io.FileNotFoundException import java.io.InputStream import java.net.URL +import java.nio.file.Path import java.util.ServiceLoader +import kotlin.io.path.extension import kotlin.reflect.KType public sealed interface SupportedFormat { @@ -35,7 +37,7 @@ public sealed interface SupportedFormat { public sealed interface SupportedFormatSample { @JvmInline - public value class DataFile(public val sampleFile: File) : SupportedFormatSample + public value class DataFile(public val sampleFilePath: Path) : SupportedFormatSample @JvmInline public value class DataUrl(public val sampleUrl: URL) : SupportedFormatSample @@ -57,6 +59,9 @@ public interface SupportedDataFrameFormat : SupportedFormat { public fun readDataFrame(stream: InputStream, header: List = emptyList()): DataFrame<*> public fun readDataFrame(file: File, header: List = emptyList()): DataFrame<*> + = readDataFrame(file.toPath(), header) + + public fun readDataFrame(path: Path, header: List = emptyList()): DataFrame<*> } /** @@ -137,10 +142,10 @@ internal fun guessFormatForExtension( ): SupportedFormat? = formats.firstOrNull { it.acceptsExtension(ext) && (sample == null || it.acceptsSample(sample)) } internal fun guessFormat( - file: File, + path: Path, formats: List = supportedFormats, - sample: SupportedFormatSample.DataFile? = SupportedFormatSample.DataFile(file), -): SupportedFormat? = guessFormatForExtension(file.extension.lowercase(), formats, sample = sample) + sample: SupportedFormatSample.DataFile? = SupportedFormatSample.DataFile(path), +): SupportedFormat? = guessFormatForExtension(path.extension.lowercase(), formats, sample = sample) internal fun guessFormat( url: URL, @@ -223,15 +228,15 @@ internal fun DataFrame.Companion.read( } internal fun DataFrame.Companion.read( - file: File, + path: Path, format: SupportedDataFrameFormat? = null, header: List = emptyList(), formats: List = supportedFormats.filterIsInstance(), ): ReadAnyFrame { - if (format != null) return format to format.readDataFrame(file, header = header) + if (format != null) return format to format.readDataFrame(path, header = header) formats.sortedBy { it.testOrder }.forEach { try { - return it to it.readDataFrame(file, header = header) + return it to it.readDataFrame(path, header = header) } catch (e: FileNotFoundException) { throw e } catch (e: Exception) { @@ -249,16 +254,10 @@ internal data class GeneratedCode(val format: SupportedCodeGenerationFormat, val internal infix fun SupportedCodeGenerationFormat.to(code: Code) = GeneratedCode(this, code) public fun DataFrame.Companion.read(file: File, header: List = emptyList()): AnyFrame = - read( - file = file, - format = guessFormat(file)?.also { - if (it !is SupportedDataFrameFormat) error("Format $it does not support reading dataframes") - } as SupportedDataFrameFormat?, - header = header, - ).df + read(file.toPath(), header) public fun DataRow.Companion.read(file: File, header: List = emptyList()): AnyRow = - DataFrame.read(file, header).single() + DataFrame.read(file.toPath(), header).single() public fun DataFrame.Companion.read(url: URL, header: List = emptyList()): AnyFrame = when { @@ -293,3 +292,19 @@ public fun URL.readDataRow(header: List = emptyList()): AnyRow = DataRow public fun File.readDataFrame(header: List = emptyList()): AnyFrame = DataFrame.read(this, header) public fun File.readDataRow(header: List = emptyList()): AnyRow = DataRow.read(this, header) + +public fun DataFrame.Companion.read(path: Path, header: List = emptyList()): AnyFrame = + read( + path = path, + format = guessFormat(path.toString())?.also { + if (it !is SupportedDataFrameFormat) error("Format $it does not support reading dataframes") + } as SupportedDataFrameFormat?, + header = header, + ).df + +public fun DataRow.Companion.read(path: Path, header: List = emptyList()): AnyRow = + DataFrame.read(path, header).single() + +public fun Path.readDataFrame(header: List = emptyList()): AnyFrame = DataFrame.read(this, header) + +public fun Path.readDataRow(header: List = emptyList()): AnyRow = DataRow.read(this, header) diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/html.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/html.kt index 978368d7c5..9548620aec 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/html.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/html.kt @@ -761,7 +761,7 @@ public class DataFrameHtmlData( ) public fun writeHtml(destination: File) { - destination.writeText(toString()) + writeHtml(destination.toPath()) } public fun writeHtml(destination: String) { @@ -774,7 +774,7 @@ public class DataFrameHtmlData( @Deprecated(WRITE_HTML, ReplaceWith(WRITE_HTML_REPLACE), DeprecationLevel.ERROR) public fun writeHTML(destination: File) { - destination.writeText(toString()) + writeHtml(destination.toPath()) } @Deprecated(WRITE_HTML, ReplaceWith(WRITE_HTML_REPLACE), DeprecationLevel.ERROR) diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/tsv.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/tsv.kt index d321d5f1dc..9a79718c67 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/tsv.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/tsv.kt @@ -17,6 +17,7 @@ import java.io.FileInputStream import java.io.InputStream import java.net.URL import java.nio.charset.Charset +import java.nio.file.Path @Deprecated( message = APACHE_CSV, @@ -28,6 +29,10 @@ public class TSV : SupportedDataFrameFormat { override fun readDataFrame(file: File, header: List): AnyFrame = DataFrame.readTSV(file, header = header) + override fun readDataFrame(path: Path, header: List): AnyFrame = + // legacy TSV implementation lives in this module; delegate via File to keep behavior + DataFrame.readTSV(path.toFile(), header = header) + override fun acceptsExtension(ext: String): Boolean = ext == "tsv" override fun acceptsSample(sample: SupportedFormatSample): Boolean = true // Extension is enough diff --git a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/jupyter/importDataSchema.kt b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/jupyter/importDataSchema.kt index cb46d8372a..51e28bef17 100644 --- a/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/jupyter/importDataSchema.kt +++ b/core/src/main/kotlin/org/jetbrains/kotlinx/dataframe/jupyter/importDataSchema.kt @@ -4,9 +4,11 @@ import org.intellij.lang.annotations.Language import java.io.File import java.net.URI import java.net.URL +import java.nio.file.Path public class ImportDataSchema(public val url: URL) { public constructor(path: String) : this(URI(path).toURL()) + public constructor(path: Path) : this(path.toUri().toURL()) public constructor(file: File) : this(file.toURI().toURL()) } @@ -14,6 +16,8 @@ public fun importDataSchema(url: URL): ImportDataSchema = ImportDataSchema(url) public fun importDataSchema(path: String): ImportDataSchema = ImportDataSchema(path) +public fun importDataSchema(path: Path): ImportDataSchema = ImportDataSchema(path) + public fun importDataSchema(file: File): ImportDataSchema = ImportDataSchema(file) @Language("kts") @@ -50,6 +54,9 @@ internal val importDataSchema = /** Import the type-only data schema from [path]. */ fun importDataSchema(path: String, name: String): Unit = importDataSchema(URI(path).toURL(), name) + /** Import the type-only data schema from [path]. */ + fun importDataSchema(path: Path, name: String): Unit = importDataSchema(path.toUri().toURL(), name) + /** Import the type-only data schema from [file]. */ fun importDataSchema(file: File, name: String): Unit = importDataSchema(file.toURI().toURL(), name) """.trimIndent() diff --git a/dataframe-arrow/api/dataframe-arrow.api b/dataframe-arrow/api/dataframe-arrow.api index e0bf301c31..c3f0a80c3b 100644 --- a/dataframe-arrow/api/dataframe-arrow.api +++ b/dataframe-arrow/api/dataframe-arrow.api @@ -6,6 +6,7 @@ public final class org/jetbrains/kotlinx/dataframe/io/ArrowFeather : org/jetbrai public fun getTestOrder ()I public fun readDataFrame (Ljava/io/File;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public fun readDataFrame (Ljava/io/InputStream;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public fun readDataFrame (Ljava/nio/file/Path;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; } public final class org/jetbrains/kotlinx/dataframe/io/ArrowReadingKt { @@ -16,24 +17,28 @@ public final class org/jetbrains/kotlinx/dataframe/io/ArrowReadingKt { public static final fun readArrowFeather (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/lang/String;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readArrowFeather (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/net/URL;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readArrowFeather (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/nio/channels/SeekableByteChannel;Lorg/apache/arrow/memory/RootAllocator;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public static final fun readArrowFeather (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/nio/file/Path;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readArrowFeather (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;[BLorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readArrowFeather$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/io/File;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readArrowFeather$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/io/InputStream;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readArrowFeather$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/lang/String;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readArrowFeather$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/net/URL;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readArrowFeather$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/nio/channels/SeekableByteChannel;Lorg/apache/arrow/memory/RootAllocator;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public static synthetic fun readArrowFeather$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/nio/file/Path;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readArrowFeather$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;[BLorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readArrowIPC (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/io/File;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readArrowIPC (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/io/InputStream;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readArrowIPC (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/lang/String;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readArrowIPC (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/net/URL;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readArrowIPC (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/nio/channels/ReadableByteChannel;Lorg/apache/arrow/memory/RootAllocator;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public static final fun readArrowIPC (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/nio/file/Path;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readArrowIPC (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;[BLorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readArrowIPC$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/io/File;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readArrowIPC$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/io/InputStream;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readArrowIPC$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/lang/String;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readArrowIPC$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/net/URL;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readArrowIPC$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/nio/channels/ReadableByteChannel;Lorg/apache/arrow/memory/RootAllocator;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public static synthetic fun readArrowIPC$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/nio/file/Path;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readArrowIPC$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;[BLorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;ILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readParquet (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;[Ljava/io/File;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;J)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readParquet (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;[Ljava/lang/String;Lorg/jetbrains/kotlinx/dataframe/api/NullabilityOptions;J)Lorg/jetbrains/kotlinx/dataframe/DataFrame; @@ -66,10 +71,13 @@ public abstract interface class org/jetbrains/kotlinx/dataframe/io/ArrowWriter : public fun writeArrowFeather (Ljava/io/File;)V public fun writeArrowFeather (Ljava/io/OutputStream;)V public fun writeArrowFeather (Ljava/nio/channels/WritableByteChannel;)V + public fun writeArrowFeather (Ljava/nio/file/Path;)V public fun writeArrowIPC (Ljava/io/File;Z)V public fun writeArrowIPC (Ljava/io/OutputStream;)V public fun writeArrowIPC (Ljava/nio/channels/WritableByteChannel;)V + public fun writeArrowIPC (Ljava/nio/file/Path;Z)V public static synthetic fun writeArrowIPC$default (Lorg/jetbrains/kotlinx/dataframe/io/ArrowWriter;Ljava/io/File;ZILjava/lang/Object;)V + public static synthetic fun writeArrowIPC$default (Lorg/jetbrains/kotlinx/dataframe/io/ArrowWriter;Ljava/nio/file/Path;ZILjava/lang/Object;)V } public final class org/jetbrains/kotlinx/dataframe/io/ArrowWriter$Companion { @@ -83,10 +91,13 @@ public final class org/jetbrains/kotlinx/dataframe/io/ArrowWriter$DefaultImpls { public static fun writeArrowFeather (Lorg/jetbrains/kotlinx/dataframe/io/ArrowWriter;Ljava/io/File;)V public static fun writeArrowFeather (Lorg/jetbrains/kotlinx/dataframe/io/ArrowWriter;Ljava/io/OutputStream;)V public static fun writeArrowFeather (Lorg/jetbrains/kotlinx/dataframe/io/ArrowWriter;Ljava/nio/channels/WritableByteChannel;)V + public static fun writeArrowFeather (Lorg/jetbrains/kotlinx/dataframe/io/ArrowWriter;Ljava/nio/file/Path;)V public static fun writeArrowIPC (Lorg/jetbrains/kotlinx/dataframe/io/ArrowWriter;Ljava/io/File;Z)V public static fun writeArrowIPC (Lorg/jetbrains/kotlinx/dataframe/io/ArrowWriter;Ljava/io/OutputStream;)V public static fun writeArrowIPC (Lorg/jetbrains/kotlinx/dataframe/io/ArrowWriter;Ljava/nio/channels/WritableByteChannel;)V + public static fun writeArrowIPC (Lorg/jetbrains/kotlinx/dataframe/io/ArrowWriter;Ljava/nio/file/Path;Z)V public static synthetic fun writeArrowIPC$default (Lorg/jetbrains/kotlinx/dataframe/io/ArrowWriter;Ljava/io/File;ZILjava/lang/Object;)V + public static synthetic fun writeArrowIPC$default (Lorg/jetbrains/kotlinx/dataframe/io/ArrowWriter;Ljava/nio/file/Path;ZILjava/lang/Object;)V } public final class org/jetbrains/kotlinx/dataframe/io/ArrowWriter$Mode { @@ -127,10 +138,13 @@ public final class org/jetbrains/kotlinx/dataframe/io/ArrowWritingKt { public static final fun writeArrowFeather (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/io/File;)V public static final fun writeArrowFeather (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/io/OutputStream;)V public static final fun writeArrowFeather (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/nio/channels/WritableByteChannel;)V + public static final fun writeArrowFeather (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/nio/file/Path;)V public static final fun writeArrowIPC (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/io/File;Z)V public static final fun writeArrowIPC (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/io/OutputStream;)V public static final fun writeArrowIPC (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/nio/channels/WritableByteChannel;)V + public static final fun writeArrowIPC (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/nio/file/Path;Z)V public static synthetic fun writeArrowIPC$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/io/File;ZILjava/lang/Object;)V + public static synthetic fun writeArrowIPC$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/nio/file/Path;ZILjava/lang/Object;)V } public final class org/jetbrains/kotlinx/dataframe/io/ConvertingException : java/lang/IllegalArgumentException { diff --git a/dataframe-arrow/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/ArrowWriter.kt b/dataframe-arrow/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/ArrowWriter.kt index a2446b85f8..d57f2836b7 100644 --- a/dataframe-arrow/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/ArrowWriter.kt +++ b/dataframe-arrow/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/ArrowWriter.kt @@ -13,6 +13,9 @@ import java.io.FileOutputStream import java.io.OutputStream import java.nio.channels.Channels import java.nio.channels.WritableByteChannel +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.StandardOpenOption public val ignoreMismatchMessage: (ConvertingMismatch) -> Unit = { message: ConvertingMismatch -> } public val writeMismatchMessage: (ConvertingMismatch) -> Unit = { message: ConvertingMismatch -> @@ -93,7 +96,16 @@ public interface ArrowWriter : AutoCloseable { * If file exists, it can be recreated or expanded. */ public fun writeArrowIPC(file: File, append: Boolean = true) { - writeArrowIPC(FileOutputStream(file, append)) + writeArrowIPC(file.toPath(), append) + } + + /** Path overload for Arrow IPC writing. */ + public fun writeArrowIPC(path: Path, append: Boolean = true) { + val options = if (append) arrayOf(StandardOpenOption.CREATE, StandardOpenOption.APPEND) + else arrayOf(StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING) + Files.newOutputStream(path, *options).use { os -> + writeArrowIPC(os) + } } /** @@ -130,7 +142,16 @@ public interface ArrowWriter : AutoCloseable { * If file exists, it would be recreated. */ public fun writeArrowFeather(file: File) { - writeArrowFeather(FileOutputStream(file)) + writeArrowFeather(file.toPath()) + } + + /** Path overload for Arrow Feather writing. */ + public fun writeArrowFeather(path: Path) { + Files.newOutputStream( + path, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, + ).use { os -> + writeArrowFeather(os) + } } /** diff --git a/dataframe-arrow/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/arrowReading.kt b/dataframe-arrow/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/arrowReading.kt index 68b4914714..0d4fc05c39 100644 --- a/dataframe-arrow/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/arrowReading.kt +++ b/dataframe-arrow/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/arrowReading.kt @@ -26,6 +26,9 @@ public class ArrowFeather : SupportedDataFrameFormat { override fun readDataFrame(file: File, header: List): AnyFrame = DataFrame.readArrowFeather(file, NullabilityOptions.Widening) + override fun readDataFrame(path: Path, header: List): AnyFrame = + DataFrame.readArrowFeather(path, NullabilityOptions.Widening) + override fun acceptsExtension(ext: String): Boolean = ext == "feather" override fun acceptsSample(sample: SupportedFormatSample): Boolean = true // Extension is enough @@ -75,7 +78,13 @@ public fun DataFrame.Companion.readArrowFeather( public fun DataFrame.Companion.readArrowIPC( file: File, nullability: NullabilityOptions = NullabilityOptions.Infer, -): AnyFrame = Files.newByteChannel(file.toPath()).use { readArrowIPC(it, nullability = nullability) } +): AnyFrame = readArrowIPC(file.toPath(), nullability) + +/** Path overload for reading Arrow IPC from file path. */ +public fun DataFrame.Companion.readArrowIPC( + path: Path, + nullability: NullabilityOptions = NullabilityOptions.Infer, +): AnyFrame = Files.newByteChannel(path).use { readArrowIPC(it, nullability = nullability) } /** * Read [Arrow interprocess streaming format](https://arrow.apache.org/docs/java/ipc.html#writing-and-reading-streaming-format) data from existing [byteArray] @@ -128,7 +137,13 @@ public fun DataFrame.Companion.readArrowIPC( public fun DataFrame.Companion.readArrowFeather( file: File, nullability: NullabilityOptions = NullabilityOptions.Infer, -): AnyFrame = Files.newByteChannel(file.toPath()).use { readArrowFeather(it, nullability = nullability) } +): AnyFrame = readArrowFeather(file.toPath(), nullability) + +/** Path overload for reading Arrow Feather from file path. */ +public fun DataFrame.Companion.readArrowFeather( + path: Path, + nullability: NullabilityOptions = NullabilityOptions.Infer, +): AnyFrame = Files.newByteChannel(path).use { readArrowFeather(it, nullability = nullability) } /** * Read [Arrow random access format](https://arrow.apache.org/docs/java/ipc.html#writing-and-reading-random-access-files) data from existing [byteArray] diff --git a/dataframe-arrow/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/arrowWriting.kt b/dataframe-arrow/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/arrowWriting.kt index a6ccb58ae5..ba155c6e52 100644 --- a/dataframe-arrow/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/arrowWriting.kt +++ b/dataframe-arrow/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/arrowWriting.kt @@ -5,6 +5,7 @@ import org.jetbrains.kotlinx.dataframe.AnyFrame import java.io.File import java.io.OutputStream import java.nio.channels.WritableByteChannel +import java.nio.file.Path /** * Create [ArrowWriter] for [this] DataFrame with target schema matching actual data @@ -46,8 +47,13 @@ public fun AnyFrame.writeArrowIPC(stream: OutputStream) { * If file exists, it can be recreated or expanded. */ public fun AnyFrame.writeArrowIPC(file: File, append: Boolean = true) { + writeArrowIPC(file.toPath(), append) +} + +/** Path overload for IPC writing. */ +public fun AnyFrame.writeArrowIPC(path: Path, append: Boolean = true) { this.arrowWriter().use { writer -> - writer.writeArrowIPC(file, append) + writer.writeArrowIPC(path, append) } } @@ -84,8 +90,13 @@ public fun AnyFrame.writeArrowFeather(stream: OutputStream) { * If file exists, it would be recreated. */ public fun AnyFrame.writeArrowFeather(file: File) { + writeArrowFeather(file.toPath()) +} + +/** Path overload for Feather writing. */ +public fun AnyFrame.writeArrowFeather(path: Path) { this.arrowWriter().use { writer -> - writer.writeArrowFeather(file) + writer.writeArrowFeather(path) } } diff --git a/dataframe-csv/api/dataframe-csv.api b/dataframe-csv/api/dataframe-csv.api index 1ead1f667b..41f6764e65 100644 --- a/dataframe-csv/api/dataframe-csv.api +++ b/dataframe-csv/api/dataframe-csv.api @@ -8,6 +8,7 @@ public final class org/jetbrains/kotlinx/dataframe/io/CsvDeephaven : org/jetbrai public fun getTestOrder ()I public fun readDataFrame (Ljava/io/File;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public fun readDataFrame (Ljava/io/InputStream;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public fun readDataFrame (Ljava/nio/file/Path;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; } public final class org/jetbrains/kotlinx/dataframe/io/QuoteMode : java/lang/Enum { @@ -100,6 +101,7 @@ public final class org/jetbrains/kotlinx/dataframe/io/TsvDeephaven : org/jetbrai public fun getTestOrder ()I public fun readDataFrame (Ljava/io/File;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public fun readDataFrame (Ljava/io/InputStream;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public fun readDataFrame (Ljava/nio/file/Path;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; } public final class org/jetbrains/kotlinx/dataframe/io/UtilKt { diff --git a/dataframe-csv/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/csv.kt b/dataframe-csv/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/csv.kt index 3b4d408145..2a6444488e 100644 --- a/dataframe-csv/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/csv.kt +++ b/dataframe-csv/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/csv.kt @@ -8,6 +8,7 @@ import org.jetbrains.kotlinx.dataframe.codeGen.DefaultReadDfMethod import org.jetbrains.kotlinx.dataframe.documentationCsv.DelimParams import java.io.File import java.io.InputStream +import java.nio.file.Path import kotlin.reflect.typeOf public class CsvDeephaven(private val delimiter: Char = DelimParams.CSV_DELIMITER) : SupportedDataFrameFormat { @@ -17,6 +18,9 @@ public class CsvDeephaven(private val delimiter: Char = DelimParams.CSV_DELIMITE override fun readDataFrame(file: File, header: List): DataFrame<*> = DataFrame.readCsv(file = file, header = header, delimiter = delimiter) + override fun readDataFrame(path: Path, header: List): DataFrame<*> = + DataFrame.readCsv(path = path, header = header, delimiter = delimiter) + override fun acceptsExtension(ext: String): Boolean = ext == "csv" override fun acceptsSample(sample: SupportedFormatSample): Boolean = true // Extension is enough diff --git a/dataframe-csv/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/tsv.kt b/dataframe-csv/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/tsv.kt index 9bc0cacd90..ecb123b93c 100644 --- a/dataframe-csv/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/tsv.kt +++ b/dataframe-csv/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/tsv.kt @@ -8,6 +8,7 @@ import org.jetbrains.kotlinx.dataframe.codeGen.DefaultReadDfMethod import org.jetbrains.kotlinx.dataframe.documentationCsv.DelimParams import java.io.File import java.io.InputStream +import java.nio.file.Path import kotlin.reflect.typeOf public class TsvDeephaven(private val delimiter: Char = DelimParams.TSV_DELIMITER) : SupportedDataFrameFormat { @@ -17,6 +18,9 @@ public class TsvDeephaven(private val delimiter: Char = DelimParams.TSV_DELIMITE override fun readDataFrame(file: File, header: List): DataFrame<*> = DataFrame.readTsv(file = file, header = header, delimiter = delimiter) + override fun readDataFrame(path: Path, header: List): DataFrame<*> = + DataFrame.readTsv(path = path, header = header, delimiter = delimiter) + override fun acceptsExtension(ext: String): Boolean = ext == "tsv" override fun acceptsSample(sample: SupportedFormatSample): Boolean = true // Extension is enough diff --git a/dataframe-excel/api/dataframe-excel.api b/dataframe-excel/api/dataframe-excel.api index 3dfa2b766d..34fb294af0 100644 --- a/dataframe-excel/api/dataframe-excel.api +++ b/dataframe-excel/api/dataframe-excel.api @@ -6,6 +6,7 @@ public final class org/jetbrains/kotlinx/dataframe/io/Excel : org/jetbrains/kotl public fun getTestOrder ()I public fun readDataFrame (Ljava/io/File;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public fun readDataFrame (Ljava/io/InputStream;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public fun readDataFrame (Ljava/nio/file/Path;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; } public final class org/jetbrains/kotlinx/dataframe/io/FormattingOptions { @@ -77,10 +78,12 @@ public final class org/jetbrains/kotlinx/dataframe/io/XlsxKt { public static final fun writeExcel (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/io/File;Lkotlin/jvm/functions/Function2;Ljava/lang/String;ZLorg/jetbrains/kotlinx/dataframe/io/WorkBookType;Z)V public static final fun writeExcel (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/io/OutputStream;Lkotlin/jvm/functions/Function2;Ljava/lang/String;ZLorg/apache/poi/ss/usermodel/Workbook;)V public static final fun writeExcel (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Ljava/lang/String;ZLorg/jetbrains/kotlinx/dataframe/io/WorkBookType;Z)V + public static final fun writeExcel (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/nio/file/Path;Lkotlin/jvm/functions/Function2;Ljava/lang/String;ZLorg/jetbrains/kotlinx/dataframe/io/WorkBookType;Z)V public static final fun writeExcel (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Lorg/apache/poi/ss/usermodel/Workbook;Lkotlin/jvm/functions/Function2;Ljava/lang/String;Z)Lorg/apache/poi/ss/usermodel/Sheet; public static synthetic fun writeExcel$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/io/File;Lkotlin/jvm/functions/Function2;Ljava/lang/String;ZLorg/jetbrains/kotlinx/dataframe/io/WorkBookType;ZILjava/lang/Object;)V public static synthetic fun writeExcel$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/io/OutputStream;Lkotlin/jvm/functions/Function2;Ljava/lang/String;ZLorg/apache/poi/ss/usermodel/Workbook;ILjava/lang/Object;)V public static synthetic fun writeExcel$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Ljava/lang/String;ZLorg/jetbrains/kotlinx/dataframe/io/WorkBookType;ZILjava/lang/Object;)V + public static synthetic fun writeExcel$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/nio/file/Path;Lkotlin/jvm/functions/Function2;Ljava/lang/String;ZLorg/jetbrains/kotlinx/dataframe/io/WorkBookType;ZILjava/lang/Object;)V public static synthetic fun writeExcel$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Lorg/apache/poi/ss/usermodel/Workbook;Lkotlin/jvm/functions/Function2;Ljava/lang/String;ZILjava/lang/Object;)Lorg/apache/poi/ss/usermodel/Sheet; } diff --git a/dataframe-excel/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/xlsx.kt b/dataframe-excel/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/xlsx.kt index 719acb7f2d..106450f395 100644 --- a/dataframe-excel/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/xlsx.kt +++ b/dataframe-excel/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/xlsx.kt @@ -39,7 +39,10 @@ import java.io.InputStream import java.io.OutputStream import java.net.URL import java.nio.file.Files +import java.nio.file.Path import java.util.Calendar +import kotlin.io.path.inputStream +import kotlin.io.path.outputStream import java.time.LocalDate as JavaLocalDate import java.time.LocalDateTime as JavaLocalDateTime import java.util.Date as JavaDate @@ -49,6 +52,8 @@ public class Excel : SupportedDataFrameFormat { override fun readDataFrame(file: File, header: List): AnyFrame = DataFrame.readExcel(file) + override fun readDataFrame(path: Path, header: List): AnyFrame = DataFrame.readExcel(path.toFile()) + override fun acceptsExtension(ext: String): Boolean = ext == "xls" || ext == "xlsx" override fun acceptsSample(sample: SupportedFormatSample): Boolean = true // Extension is enough @@ -627,11 +632,28 @@ public fun DataFrame.writeExcel( writeHeader: Boolean = true, workBookType: WorkBookType = WorkBookType.XLSX, keepFile: Boolean = false, +): Unit = + writeExcel( + path = file.toPath(), + columnsSelector = columnsSelector, + sheetName = sheetName, + writeHeader = writeHeader, + workBookType = workBookType, + keepFile = keepFile, + ) + +/** Path overload for writing this DataFrame to an Excel file. */ +public fun DataFrame.writeExcel( + path: Path, + columnsSelector: ColumnsSelector = { all() }, + sheetName: String? = null, + writeHeader: Boolean = true, + workBookType: WorkBookType = WorkBookType.XLSX, + keepFile: Boolean = false, ) { val factory = - // Write to an existing file with `keepFile` flag - if (keepFile && file.exists() && file.length() > 0L) { - val fis = file.inputStream() + if (keepFile && Files.exists(path) && Files.size(path) > 0L) { + val fis = path.inputStream() when (workBookType) { WorkBookType.XLS -> HSSFWorkbook(fis) WorkBookType.XLSX -> XSSFWorkbook(fis) @@ -639,12 +661,10 @@ public fun DataFrame.writeExcel( } else { when (workBookType) { WorkBookType.XLS -> HSSFWorkbook() - - // Use streaming mode for a new XLSX file WorkBookType.XLSX -> SXSSFWorkbook() } } - return file.outputStream().use { + return path.outputStream().use { writeExcel(it, columnsSelector, sheetName, writeHeader, factory) } } diff --git a/dataframe-geo/src/main/kotlin/org/jetbrains/kotlinx/dataframe/geo/io/write.kt b/dataframe-geo/src/main/kotlin/org/jetbrains/kotlinx/dataframe/geo/io/write.kt index 72cf80f851..2f907c3730 100644 --- a/dataframe-geo/src/main/kotlin/org/jetbrains/kotlinx/dataframe/geo/io/write.kt +++ b/dataframe-geo/src/main/kotlin/org/jetbrains/kotlinx/dataframe/geo/io/write.kt @@ -8,29 +8,36 @@ import org.geotools.geojson.feature.FeatureJSON import org.jetbrains.kotlinx.dataframe.geo.GeoDataFrame import org.jetbrains.kotlinx.dataframe.geo.geotools.toSimpleFeatureCollection import java.io.File +import java.nio.file.Files +import java.nio.file.Path fun GeoDataFrame<*>.writeGeoJson(path: String): Unit = writeGeoJson(File(path)) -fun GeoDataFrame<*>.writeGeoJson(file: File) { - // TODO: adds ids that breaks order of reading +/** Path overload for writing GeoJSON */ +fun GeoDataFrame<*>.writeGeoJson(path: Path) { val featureJSON = FeatureJSON() - file.outputStream().use { outputStream -> + Files.newOutputStream(path).use { outputStream -> featureJSON.writeFeatureCollection(toSimpleFeatureCollection(), outputStream) } } +fun GeoDataFrame<*>.writeGeoJson(file: File) { + // TODO: adds ids that breaks order of reading + writeGeoJson(file.toPath()) +} + fun GeoDataFrame<*>.writeShapefile(directoryPath: String): Unit = writeShapefile(File(directoryPath)) -fun GeoDataFrame<*>.writeShapefile(directory: File) { - if (!directory.exists()) { - directory.mkdirs() +/** Path overload for writing Shapefile to a directory */ +fun GeoDataFrame<*>.writeShapefile(directory: Path) { + if (!Files.exists(directory)) { + Files.createDirectories(directory) } - val fileName = directory.name - - val file = File(directory, "$fileName.shp") + val fileName = directory.fileName.toString() + val shp = directory.resolve("$fileName.shp") val creationParams = mutableMapOf() - creationParams["url"] = file.toURI().toURL() + creationParams["url"] = shp.toUri().toURL() val factory = FileDataStoreFinder.getDataStoreFactory("shp") val dataStore = factory.createNewDataStore(creationParams) @@ -56,3 +63,7 @@ fun GeoDataFrame<*>.writeShapefile(directory: File) { transaction.close() } } + +fun GeoDataFrame<*>.writeShapefile(directory: File) { + writeShapefile(directory.toPath()) +} diff --git a/dataframe-jdbc/api/dataframe-jdbc.api b/dataframe-jdbc/api/dataframe-jdbc.api index 96edb36662..94d20cb36a 100644 --- a/dataframe-jdbc/api/dataframe-jdbc.api +++ b/dataframe-jdbc/api/dataframe-jdbc.api @@ -22,6 +22,7 @@ public final class org/jetbrains/kotlinx/dataframe/io/Jdbc : org/jetbrains/kotli public fun readCodeForGeneration (Ljava/io/InputStream;Ljava/lang/String;Z)Ljava/lang/String; public fun readDataFrame (Ljava/io/File;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public fun readDataFrame (Ljava/io/InputStream;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public fun readDataFrame (Ljava/nio/file/Path;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; } public final class org/jetbrains/kotlinx/dataframe/io/JdbcSchemaKt { diff --git a/dataframe-jdbc/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/Jdbc.kt b/dataframe-jdbc/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/Jdbc.kt index 386500e005..0895f49411 100644 --- a/dataframe-jdbc/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/Jdbc.kt +++ b/dataframe-jdbc/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/Jdbc.kt @@ -7,6 +7,7 @@ import org.jetbrains.kotlinx.dataframe.codeGen.Code import org.jetbrains.kotlinx.dataframe.codeGen.DefaultReadDfMethod import java.io.File import java.io.InputStream +import java.nio.file.Path // TODO: https://github.com/Kotlin/dataframe/issues/450 public class Jdbc : @@ -14,7 +15,7 @@ public class Jdbc : SupportedDataFrameFormat { public override fun readDataFrame(stream: InputStream, header: List): AnyFrame = DataFrame.readJDBC(stream) - public override fun readDataFrame(file: File, header: List): AnyFrame = DataFrame.readJDBC(file) + public override fun readDataFrame(path: Path, header: List): AnyFrame = DataFrame.readJDBC(path) override fun readCodeForGeneration( stream: InputStream, @@ -42,6 +43,10 @@ private fun DataFrame.Companion.readJDBC(stream: File): DataFrame<*> { TODO("Not yet implemented") } +private fun DataFrame.Companion.readJDBC(path: Path): DataFrame<*> { + TODO("Not yet implemented") +} + private fun DataFrame.Companion.readJDBC(stream: InputStream): DataFrame<*> { TODO("Not yet implemented") } diff --git a/dataframe-json/api/dataframe-json.api b/dataframe-json/api/dataframe-json.api index 0c70a1c831..368faf4a12 100644 --- a/dataframe-json/api/dataframe-json.api +++ b/dataframe-json/api/dataframe-json.api @@ -29,6 +29,7 @@ public final class org/jetbrains/kotlinx/dataframe/io/JSON : org/jetbrains/kotli public fun getTestOrder ()I public fun readDataFrame (Ljava/io/File;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public fun readDataFrame (Ljava/io/InputStream;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public fun readDataFrame (Ljava/nio/file/Path;Ljava/util/List;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; } public final class org/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic : java/lang/Enum { @@ -44,18 +45,22 @@ public final class org/jetbrains/kotlinx/dataframe/io/JsonKt { public static final fun readJson (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/io/InputStream;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;Z)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readJson (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;Z)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readJson (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/net/URL;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;Z)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public static final fun readJson (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/nio/file/Path;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;Z)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readJson (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/io/File;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;Z)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static final fun readJson (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/io/InputStream;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;Z)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static final fun readJson (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;Z)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static final fun readJson (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/net/URL;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;Z)Lorg/jetbrains/kotlinx/dataframe/DataRow; + public static final fun readJson (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/nio/file/Path;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;Z)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static synthetic fun readJson$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/io/File;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readJson$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/io/InputStream;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readJson$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readJson$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/net/URL;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; + public static synthetic fun readJson$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/nio/file/Path;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static synthetic fun readJson$default (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/io/File;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static synthetic fun readJson$default (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/io/InputStream;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static synthetic fun readJson$default (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static synthetic fun readJson$default (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/net/URL;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataRow; + public static synthetic fun readJson$default (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/nio/file/Path;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static final fun readJsonStr (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;Z)Lorg/jetbrains/kotlinx/dataframe/DataFrame; public static final fun readJsonStr (Lorg/jetbrains/kotlinx/dataframe/DataRow$Companion;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;Z)Lorg/jetbrains/kotlinx/dataframe/DataRow; public static synthetic fun readJsonStr$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame$Companion;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlinx/dataframe/io/JSON$TypeClashTactic;ZILjava/lang/Object;)Lorg/jetbrains/kotlinx/dataframe/DataFrame; @@ -69,14 +74,18 @@ public final class org/jetbrains/kotlinx/dataframe/io/JsonKt { public static final fun writeJson (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/io/File;Z)V public static final fun writeJson (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/lang/Appendable;Z)V public static final fun writeJson (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/lang/String;Z)V + public static final fun writeJson (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/nio/file/Path;Z)V public static final fun writeJson (Lorg/jetbrains/kotlinx/dataframe/DataRow;Ljava/io/File;Z)V public static final fun writeJson (Lorg/jetbrains/kotlinx/dataframe/DataRow;Ljava/lang/Appendable;Z)V public static final fun writeJson (Lorg/jetbrains/kotlinx/dataframe/DataRow;Ljava/lang/String;Z)V + public static final fun writeJson (Lorg/jetbrains/kotlinx/dataframe/DataRow;Ljava/nio/file/Path;Z)V public static synthetic fun writeJson$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/io/File;ZILjava/lang/Object;)V public static synthetic fun writeJson$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/lang/Appendable;ZILjava/lang/Object;)V public static synthetic fun writeJson$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/lang/String;ZILjava/lang/Object;)V + public static synthetic fun writeJson$default (Lorg/jetbrains/kotlinx/dataframe/DataFrame;Ljava/nio/file/Path;ZILjava/lang/Object;)V public static synthetic fun writeJson$default (Lorg/jetbrains/kotlinx/dataframe/DataRow;Ljava/io/File;ZILjava/lang/Object;)V public static synthetic fun writeJson$default (Lorg/jetbrains/kotlinx/dataframe/DataRow;Ljava/lang/Appendable;ZILjava/lang/Object;)V public static synthetic fun writeJson$default (Lorg/jetbrains/kotlinx/dataframe/DataRow;Ljava/lang/String;ZILjava/lang/Object;)V + public static synthetic fun writeJson$default (Lorg/jetbrains/kotlinx/dataframe/DataRow;Ljava/nio/file/Path;ZILjava/lang/Object;)V } diff --git a/dataframe-json/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/json.kt b/dataframe-json/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/json.kt index 4cb4e5a3ec..4d3f9db602 100644 --- a/dataframe-json/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/json.kt +++ b/dataframe-json/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/json.kt @@ -29,6 +29,8 @@ import org.jetbrains.kotlinx.dataframe.io.JSON.TypeClashTactic.ARRAY_AND_VALUE_C import java.io.File import java.io.InputStream import java.net.URL +import java.nio.file.Path +import kotlin.io.path.writeText import kotlin.reflect.typeOf public class JSON( @@ -55,6 +57,15 @@ public class JSON( unifyNumbers = unifyNumbers, ) + override fun readDataFrame(path: Path, header: List): AnyFrame = + DataFrame.readJson( + path = path, + header = header, + keyValuePaths = keyValuePaths, + typeClashTactic = typeClashTactic, + unifyNumbers = unifyNumbers, + ) + override fun acceptsExtension(ext: String): Boolean = ext == "json" override fun acceptsSample(sample: SupportedFormatSample): Boolean = true // Extension is enough @@ -145,7 +156,16 @@ public fun DataFrame.Companion.readJson( keyValuePaths: List = emptyList(), typeClashTactic: TypeClashTactic = ARRAY_AND_VALUE_COLUMNS, unifyNumbers: Boolean = true, -): AnyFrame = DataFrame.readJson(file.toURI().toURL(), header, keyValuePaths, typeClashTactic, unifyNumbers) +): AnyFrame = DataFrame.readJson(file.toPath(), header, keyValuePaths, typeClashTactic, unifyNumbers) + +/** Path overload for reading JSON into DataFrame. */ +public fun DataFrame.Companion.readJson( + path: Path, + header: List = emptyList(), + keyValuePaths: List = emptyList(), + typeClashTactic: TypeClashTactic = ARRAY_AND_VALUE_COLUMNS, + unifyNumbers: Boolean = true, +): AnyFrame = DataFrame.readJson(path.toUri().toURL(), header, keyValuePaths, typeClashTactic, unifyNumbers) /** * @param file Where to fetch the Json as [InputStream] to be converted to a [DataRow]. @@ -162,7 +182,16 @@ public fun DataRow.Companion.readJson( keyValuePaths: List = emptyList(), typeClashTactic: TypeClashTactic = ARRAY_AND_VALUE_COLUMNS, unifyNumbers: Boolean = true, -): AnyRow = DataFrame.readJson(file, header, keyValuePaths, typeClashTactic, unifyNumbers).single() +): AnyRow = DataFrame.readJson(file.toPath(), header, keyValuePaths, typeClashTactic, unifyNumbers).single() + +/** Path overload for reading JSON into DataRow. */ +public fun DataRow.Companion.readJson( + path: Path, + header: List = emptyList(), + keyValuePaths: List = emptyList(), + typeClashTactic: TypeClashTactic = ARRAY_AND_VALUE_COLUMNS, + unifyNumbers: Boolean = true, +): AnyRow = DataFrame.readJson(path, header, keyValuePaths, typeClashTactic, unifyNumbers).single() /** * @param path URL or file path from where to fetch the Json as [InputStream] to be converted to a [DataFrame]. @@ -409,7 +438,11 @@ public fun AnyRow.toJson(prettyPrint: Boolean = false): String { } public fun AnyFrame.writeJson(file: File, prettyPrint: Boolean = false) { - file.writeText(toJson(prettyPrint)) + writeJson(file.toPath(), prettyPrint) +} + +public fun AnyFrame.writeJson(path: Path, prettyPrint: Boolean = false) { + path.writeText(toJson(prettyPrint)) } public fun AnyFrame.writeJson(path: String, prettyPrint: Boolean = false): Unit = writeJson(File(path), prettyPrint) @@ -419,7 +452,11 @@ public fun AnyFrame.writeJson(writer: Appendable, prettyPrint: Boolean = false) } public fun AnyRow.writeJson(file: File, prettyPrint: Boolean = false) { - file.writeText(toJson(prettyPrint)) + writeJson(file.toPath(), prettyPrint) +} + +public fun AnyRow.writeJson(path: Path, prettyPrint: Boolean = false) { + path.writeText(toJson(prettyPrint)) } public fun AnyRow.writeJson(path: String, prettyPrint: Boolean = false) { diff --git a/dataframe-openapi-generator/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/OpenApi.kt b/dataframe-openapi-generator/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/OpenApi.kt index b738b3b701..ec06cd1b52 100644 --- a/dataframe-openapi-generator/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/OpenApi.kt +++ b/dataframe-openapi-generator/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/OpenApi.kt @@ -77,7 +77,7 @@ public class OpenApi : SupportedCodeGenerationFormat { try { when (sample) { is SupportedFormatSample.DataString -> isOpenApiStr(sample.sampleData) - is SupportedFormatSample.DataFile -> isOpenApi(sample.sampleFile) + is SupportedFormatSample.DataFile -> isOpenApi(sample.sampleFilePath) is SupportedFormatSample.PathString -> isOpenApi(sample.samplePath) is SupportedFormatSample.DataUrl -> isOpenApi(sample.sampleUrl) } diff --git a/dataframe-openapi-generator/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/isOpenApi.kt b/dataframe-openapi-generator/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/isOpenApi.kt index 170a8617dc..8e243d6290 100644 --- a/dataframe-openapi-generator/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/isOpenApi.kt +++ b/dataframe-openapi-generator/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io/isOpenApi.kt @@ -4,6 +4,9 @@ import io.github.oshai.kotlinlogging.KotlinLogging import io.swagger.parser.OpenAPIParser import java.io.File import java.net.URL +import java.nio.file.Path +import kotlin.io.path.extension +import kotlin.io.path.readText private val logger = KotlinLogging.logger {} @@ -30,14 +33,15 @@ public fun isOpenApi(url: URL): Boolean { return isOpenApiStr(url.readText()) } -public fun isOpenApi(file: File): Boolean { - if (file.extension.lowercase() in listOf("yml", "yaml")) { + +public fun isOpenApi(path: Path): Boolean { + if (path.extension.lowercase() in listOf("yml", "yaml")) { return true } - if (file.extension.lowercase() != "json") { + if (path.extension.lowercase() != "json") { return false } - return isOpenApiStr(file.readText()) + return isOpenApiStr(path.readText()) }