diff --git a/.gitignore b/.gitignore index 50d1a09..91a41dd 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,3 @@ bin .project .settings .gradle -.idea/ -build/ diff --git a/README.md b/README.md index d77fa72..dbb0441 100644 --- a/README.md +++ b/README.md @@ -4,21 +4,12 @@ This is the companion repository to the following medium post: [Doing cool data ## Data The data was extracted from [Eurostat](http://appsso.eurostat.ec.europa.eu/nui/show.do?dataset=urb_cpop1&lang=en) in the beginning of September 2018. I opened the extracted CSV in LibreOffice and saved it again because there were some illegal UTF-8 characters in the Eurostat output that some csv importers couldn't handle directly. -# Results [June 2025] - -| Library | Maintained | Version | Time (ms) | -|---------------------------------------------------------|------------|-----------|-----------| -| [DuckDb](https://github.com/duckdb/duckdb-java) | Y | 1.3.0 | 93 | -| [DFLib](https://github.com/dflib/dflib) | Y | 1.3.0 | 226 | -| [Kotlin DataFrame](https://github.com/Kotlin/dataframe) | Y | 1.0-beta2 | 816 | -| [Tablesaw](https://github.com/jtablesaw/tablesaw) | Y | 0.44.1 | 820 | -| Joinery | n | 1.9 | 1,478 | -| Krangl | n | 0.18.4 | 1,796 | -| Morpheus | n | 0.9.23 | * | - -* Morpheus is no longer maintained and doesn't seem to work on later java versions (error related to accessing `sun.util.calendar.ZoneInfo`) - ## Code The code for the three libraries is present in the `Test{libraryname}.java` files. They all use `CheckResult.java` to do a basic correctness check for the top-growing cities. +The libraries tested fully are: +* [tablesaw](https://github.com/jtablesaw/tablesaw) +* [joinery](https://github.com/cardillo/joinery) +* [morpheus](https://github.com/zavtech/morpheus-core) + As described in the [medium post](https://medium.com/@thijser/doing-cool-data-science-in-java-how-3-dataframe-libraries-stack-up-5e6ccb7b437), I couldn't find a good way to do the pivot step in [datavec](https://deeplearning4j.org/docs/latest/datavec-overview), but I included the code I wrote up until that point. diff --git a/build.gradle b/build.gradle index e281543..c41d38a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,8 @@ buildscript { - ext.kotlin_version = '2.1.21' + ext.kotlin_version = '1.3.61' repositories { mavenCentral() + jcenter() } dependencies { @@ -13,32 +14,26 @@ apply plugin: 'java' apply plugin: 'kotlin' apply plugin: 'eclipse' -sourceCompatibility = '21' +sourceCompatibility = 1.8 repositories { mavenCentral() - maven { url 'https://maven.scijava.org/content/repositories/public/' } + jcenter() } dependencies { - implementation 'tech.tablesaw:tablesaw-core:0.44.1' - // needed for tablesaw - implementation 'com.google.guava:guava:31.1-jre' + implementation 'tech.tablesaw:tablesaw-core:0.37.3' implementation 'joinery:joinery-dataframe:1.9' // For the CSV import joinery needs this dependency too: implementation 'org.apache.poi:poi:3.17' - implementation 'com.zavtech:morpheus-core:0.9.23' + implementation 'com.zavtech:morpheus-core:0.9.21' implementation 'org.datavec:datavec-api:1.0.0-beta2' implementation 'org.datavec:datavec-local:1.0.0-beta2' - implementation 'com.github.holgerbrandl:krangl:0.18.4' + implementation "de.mpicbg.scicomp:krangl:0.11" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" - - implementation "org.jetbrains.kotlinx:dataframe:1.0.0-Beta2" - implementation 'org.duckdb:duckdb_jdbc:1.3.0.0' - implementation 'org.dflib:dflib-csv:1.3.0' } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 9bbc975..0000000 Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 37f853b..0000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,7 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip -networkTimeout=10000 -validateDistributionUrl=true -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew deleted file mode 100755 index faf9300..0000000 --- a/gradlew +++ /dev/null @@ -1,251 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# SPDX-License-Identifier: Apache-2.0 -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC2039,SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, -# and any embedded shellness will be escaped. -# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be -# treated as '${Hostname}' itself on the command line. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index 9b42019..0000000 --- a/gradlew.bat +++ /dev/null @@ -1,94 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem -@rem SPDX-License-Identifier: Apache-2.0 -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/src/main/java/test_dataframes/TestDFLib.java b/src/main/java/test_dataframes/TestDFLib.java deleted file mode 100644 index fe3467d..0000000 --- a/src/main/java/test_dataframes/TestDFLib.java +++ /dev/null @@ -1,69 +0,0 @@ -package test_dataframes; - -import com.google.common.base.Stopwatch; -import org.apache.commons.csv.CSVFormat; -import org.dflib.DataFrame; -import org.dflib.Printers; -import org.dflib.ValueMapper; -import org.dflib.csv.Csv; -import org.dflib.print.Printer; - -import static org.dflib.Exp.*; - -/** - * Test the API of tablesaw to do some basic dataframe manipulations. - *

- * https://github.com/dflib/dflib - *

- * See https://medium.com/@thijser/doing-cool-data-science-in-java-how-3-dataframe-libraries-stack-up-5e6ccb7b437 - * for more information. - */ -public class TestDFLib { - public static void main(String[] args) { - - Printer printer = Printers.tabular(10, 100); - - DataFrame data = Csv.loader() - .format(CSVFormat.DEFAULT.builder().setNullString(":").build()) - .col("Value", ValueMapper.stringToInt()) - .load("urb_cpop1_1_Data.csv"); - System.out.println(printer.toString(data)); - - Stopwatch watch = Stopwatch.createStarted(); - DataFrame filtered = data.rows($col("Value").isNotNull()).select(); - - DataFrame cities = filtered.group("CITIES", "INDIC_UR", "TIME") - .cols("CITIES", "INDIC_UR", "TIME", "Mean [Value]") - .agg($col("CITIES"), $col("INDIC_UR"), $col("TIME"), $int("Value").avg().castAsInt()); - - System.out.println(printer.toString(cities)); - - // Need to transpose/pivot now too - DataFrame finalTable = cities - .cols("key").merge(concat($str("CITIES"), ":", $str("INDIC_UR"))) - .pivot().rows("key").cols("TIME").vals("Mean [Value]"); - - // sortDescendingOn puts N/A values first unfortunately, so let's remove them - // before determining and printing. - DataFrame existing2017 = finalTable - .rowsExcept($int("2017").isNull()).select() - .rows($str("key").endsWith("January, total")).select() - .sort($int("2017").desc()); - System.out.println(printer.toString(existing2017)); - - // Add growth column - - DataFrame finalTable1 = finalTable - .cols("growth").merge($int("2016").castAsDouble().div($int("2010")).sub(1).mul(100)); - - DataFrame highestGrowthTable = finalTable1 - .rows($str("key").endsWith("January, total")).select() - .rowsExcept($col("growth").isNull()).select() - .sort($double("growth").desc()); - - System.out.println(printer.toString(highestGrowthTable)); - CheckResult.checkResult(highestGrowthTable.getColumn("key").toList()); - - System.out.println("Total time: " + watch); - } -} diff --git a/src/main/java/test_dataframes/TestDuckDb.kt b/src/main/java/test_dataframes/TestDuckDb.kt deleted file mode 100644 index a35a232..0000000 --- a/src/main/java/test_dataframes/TestDuckDb.kt +++ /dev/null @@ -1,53 +0,0 @@ -package test_dataframes - -import com.google.common.base.Stopwatch -import tech.tablesaw.api.Table -import java.sql.DriverManager - - -/** - * Test duckdb to do some basic dataframe manipulations. - * - * See https://medium.com/@thijser/doing-cool-data-science-in-java-how-3-dataframe-libraries-stack-up-5e6ccb7b437 - * for more information. - */ -fun main() { - val conn = DriverManager.getConnection("jdbc:duckdb:") - val stmt = conn.createStatement() - var rs = stmt.executeQuery("SELECT * FROM 'urb_cpop1_1_Data.csv'") - Table.read().db(rs).print().also { println(it) } - - val watch = Stopwatch.createStarted() - stmt.execute( - """ - CREATE TEMP TABLE t1 AS ( - WITH cities AS ( - SELECT CITIES || ':' || INDIC_UR as key, - CAST(Value AS INTEGER) as Value, - * EXCLUDE (CITIES, INDIC_UR, Value) - FROM 'urb_cpop1_1_Data.csv' WHERE Value != ':'), - pivot_table AS ( - PIVOT cities - ON TIME - USING AVG(Value) - GROUP BY key - ) - SELECT *, ("2016"::REAL / "2010"::REAL - 1.0 ) * 100.0 as growth - FROM pivot_table - WHERE suffix(key, 'January, total') - ORDER BY growth DESC - ) - """ - ) - rs = stmt.executeQuery("SELECT * FROM t1") - Table.read().db(rs).print().also { println(it) } - val result = stmt.executeQuery("SELECT key FROM t1").use { r -> - mutableListOf().apply { - while (r.next()) { - this += r.getString("key") - } - } - } - CheckResult.checkResult(result) - println("Total time: $watch") -} \ No newline at end of file diff --git a/src/main/java/test_dataframes/TestKotlinDataFrame.kt b/src/main/java/test_dataframes/TestKotlinDataFrame.kt deleted file mode 100644 index 7c142b4..0000000 --- a/src/main/java/test_dataframes/TestKotlinDataFrame.kt +++ /dev/null @@ -1,39 +0,0 @@ -package test_dataframes - -import com.google.common.base.Stopwatch -import org.jetbrains.kotlinx.dataframe.DataFrame -import org.jetbrains.kotlinx.dataframe.io.* -import org.jetbrains.kotlinx.dataframe.api.* -/** - * Test the API of Kotlin Dataframes to do some basic dataframe manipulations. - * - * See https://medium.com/@thijser/doing-cool-data-science-in-java-how-3-dataframe-libraries-stack-up-5e6ccb7b437 - * for more information. - */ -fun main() { - val keyColumn = "key" - val df = DataFrame.readCsv(fileOrUrl = "urb_cpop1_1_Data.csv", delimiter = ',') - df.print() - val watch = Stopwatch.createStarted() - // remove missing values indicated with ":", convert column to IntCol - val filtered = df.filter { "Value"() != ":" } - .add(keyColumn) { "CITIES"() + ":" + "INDIC_UR"() } - .convert { "Value"() }.toInt() - - var cities = filtered.groupBy(keyColumn).pivot("TIME", inward = false).mean { "Value"() } - cities.print() - - cities = cities.filter { keyColumn().endsWith("January, total") }.sortByDesc("2017") - cities.print() - - // growth - val highestGrowthTable = - cities.filter { "2010"() != null && "2016"() != null } - .add("growth") { ("2016"() / "2010"() - 1.0) * 100.0 } - .sortByDesc("growth") - highestGrowthTable.print() - - CheckResult.checkResult(highestGrowthTable[keyColumn].toList()) - //highestGrowthTable[{ key }].toList()) - println("Total time: $watch") -} \ No newline at end of file diff --git a/src/main/java/test_dataframes/TestKrangl.kt b/src/main/java/test_dataframes/TestKrangl.kt index ea010ba..26ce160 100644 --- a/src/main/java/test_dataframes/TestKrangl.kt +++ b/src/main/java/test_dataframes/TestKrangl.kt @@ -34,6 +34,6 @@ fun main() { println(highestGrowthTable.select("CITIES", "growth").head(10)) - CheckResult.checkResult(highestGrowthTable["CITIES"].asType().toList()) + CheckResult.checkResult(highestGrowthTable["CITIES"].asStrings().toList()) println("Total time: $watch") } \ No newline at end of file diff --git a/src/main/java/test_dataframes/TestTablesaw.java b/src/main/java/test_dataframes/TestTablesaw.java index abb41a4..16f606d 100644 --- a/src/main/java/test_dataframes/TestTablesaw.java +++ b/src/main/java/test_dataframes/TestTablesaw.java @@ -18,7 +18,7 @@ * for more information. */ public class TestTablesaw { - public static void main(String[] args) { + public static void main(String[] args) throws Exception { // This automatically makes the ":" values missing Table data = Table.read().csv( CsvReadOptions.builder("urb_cpop1_1_Data.csv").missingValueIndicator(":").build());