Skip to content

Commit 97abe22

Browse files
authored
SCALA-268 (#1760)
* SCALA-268 Scala CSV Read/Write * Naming convention fixed
1 parent 7a0849f commit 97abe22

16 files changed

+458
-1
lines changed

build.sbt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,11 @@ lazy val scala_libraries = (project in file("scala-libraries"))
442442
"org.apache.logging.log4j" % "log4j-core" % "2.24.3" % Runtime,
443443
"com.typesafe.scala-logging" %% "scala-logging" % "3.9.5",
444444
"software.amazon.awssdk" % "s3" % "2.25.9",
445-
"com.github.seratch" %% "awscala" % "0.9.2"
445+
"com.github.seratch" %% "awscala" % "0.9.2",
446+
"com.opencsv" % "opencsv" % "5.9",
447+
"com.github.tototoshi" %% "scala-csv" % "2.0.0",
448+
"org.apache.commons" % "commons-csv" % "1.12.0"
449+
446450
),
447451
libraryDependencies ++= Seq(
448452
"org.playframework" %% "play-slick" % LibraryVersions.playSlickVersion,
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
id,name
2+
1,Jim
3+
2,Bob
4+
3,Mary
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.baeldung.csv.reader
2+
3+
import org.apache.commons.csv.CSVFormat
4+
5+
import java.io.{File, FileInputStream, InputStreamReader}
6+
import scala.jdk.CollectionConverters.IterableHasAsScala
7+
8+
class ApacheCommonsCSVReader extends CommaSeparatedValuesReader {
9+
10+
override def read(file: File): CSVReadDigest = {
11+
val in = new InputStreamReader(new FileInputStream(file))
12+
val csvParser = CSVFormat.DEFAULT
13+
.builder()
14+
.setHeader()
15+
.build()
16+
.parse(in)
17+
val result = CSVReadDigest(
18+
csvParser.getHeaderNames.asScala.toSeq,
19+
csvParser.getRecords.asScala.map(r => r.values().toSeq).toSeq
20+
)
21+
csvParser.close()
22+
result
23+
}
24+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.baeldung.csv.reader
2+
3+
import java.io.File
4+
5+
object CSVReaders {
6+
7+
def main(args: Array[String]): Unit = {
8+
9+
val apacheCommonsCSVReader = new ApacheCommonsCSVReader
10+
val simpleCSVReader = new SimpleCSVReader
11+
val scalaCSVReader = new ScalaCSVReader
12+
val openCSVReader = new OpenCSVReader
13+
14+
val file = new File(getClass.getResource("/persons.csv").getFile)
15+
16+
println(apacheCommonsCSVReader.read(file))
17+
println(simpleCSVReader.read(file))
18+
println(scalaCSVReader.read(file))
19+
println(openCSVReader.read(file))
20+
21+
}
22+
23+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.baeldung.csv.reader
2+
3+
import java.io.File
4+
5+
case class CSVReadDigest(headers: Seq[String], rows: Seq[Seq[String]])
6+
trait CommaSeparatedValuesReader {
7+
8+
def read(file: File): CSVReadDigest
9+
10+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.baeldung.csv.reader
2+
3+
import com.opencsv.CSVReader
4+
5+
import java.io.{File, FileInputStream, InputStreamReader}
6+
import scala.annotation.tailrec
7+
8+
class OpenCSVReader extends CommaSeparatedValuesReader {
9+
10+
override def read(file: File): CSVReadDigest = {
11+
12+
val reader = new CSVReader(
13+
new InputStreamReader(new FileInputStream(file))
14+
)
15+
16+
@tailrec
17+
def readLinesRecursively(
18+
currentReader: CSVReader,
19+
result: Seq[Seq[String]]
20+
): Seq[Seq[String]] = {
21+
currentReader.readNext() match {
22+
case null => result
23+
case line => readLinesRecursively(currentReader, result :+ line.toSeq)
24+
}
25+
}
26+
27+
val csvLines = readLinesRecursively(reader, List())
28+
reader.close()
29+
30+
CSVReadDigest(
31+
csvLines.head,
32+
csvLines.tail
33+
)
34+
}
35+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.baeldung.csv.reader
2+
3+
import com.github.tototoshi.csv.CSVReader
4+
5+
import java.io.File
6+
7+
class ScalaCSVReader extends CommaSeparatedValuesReader {
8+
9+
override def read(file: File): CSVReadDigest = {
10+
val reader = CSVReader.open(file)
11+
val all = reader.all()
12+
reader.close()
13+
CSVReadDigest(all.head, all.tail)
14+
}
15+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.baeldung.csv.reader
2+
3+
import java.io.{BufferedReader, File, FileInputStream, InputStreamReader}
4+
import scala.annotation.tailrec
5+
6+
class SimpleCSVReader extends CommaSeparatedValuesReader {
7+
8+
override def read(file: File): CSVReadDigest = {
9+
val in = new InputStreamReader(new FileInputStream(file))
10+
val bufferedReader = new BufferedReader(in)
11+
12+
@tailrec
13+
def readLinesRecursively(
14+
currentBufferedReader: BufferedReader,
15+
result: Seq[Seq[String]]
16+
): Seq[Seq[String]] = {
17+
currentBufferedReader.readLine() match {
18+
case null => result
19+
case line =>
20+
readLinesRecursively(
21+
currentBufferedReader,
22+
result :+ line.split(",").toSeq
23+
)
24+
}
25+
}
26+
27+
val csvLines = readLinesRecursively(bufferedReader, List())
28+
29+
bufferedReader.close()
30+
31+
CSVReadDigest(
32+
csvLines.head,
33+
csvLines.tail
34+
)
35+
}
36+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.baeldung.csv.writer
2+
import org.apache.commons.csv.{CSVFormat, CSVPrinter}
3+
4+
import java.io.{File, FileWriter}
5+
import scala.util.Try
6+
7+
class ApacheCommonsCSVWriter extends CommaSeparatedValuesWriter {
8+
9+
override def write(
10+
file: File,
11+
headers: Seq[String],
12+
rows: Seq[Seq[String]]
13+
): Try[Unit] = Try {
14+
15+
val csvFormat = CSVFormat.DEFAULT
16+
.builder()
17+
.setHeader(headers: _*)
18+
.build()
19+
20+
val out = new FileWriter(file)
21+
val printer = new CSVPrinter(out, csvFormat)
22+
rows.foreach(row => printer.printRecord(row: _*))
23+
printer.close()
24+
}
25+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.baeldung.csv.writer
2+
3+
import java.io.File
4+
import scala.util.Try
5+
6+
trait CommaSeparatedValuesWriter {
7+
8+
def write(
9+
file: File,
10+
headers: Seq[String],
11+
rows: Seq[Seq[String]]
12+
): Try[Unit]
13+
14+
}

0 commit comments

Comments
 (0)