提交 fde941c2 编写于 作者: 梦境迷离's avatar 梦境迷离

optimize csv

Signed-off-by: 梦境迷离's avatar梦境迷离 <dreamylost@outlook.com>
上级 927d525e
......@@ -45,7 +45,7 @@ object FileUtils {
resource.close()
}
def writer(file: File, lines: List[String], format: CsvFormat): Boolean = {
def write(file: File, lines: List[String], format: CsvFormat): Boolean = {
checkFile(file)
val bufferedWriter = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(file, format.append), format.encoding)
......@@ -59,6 +59,7 @@ object FileUtils {
} else {
r.println(line)
}
r.flush()
}
}
finally bufferedWriter.close()
......@@ -66,7 +67,7 @@ object FileUtils {
}
// TODO read url
def reader(file: InputStream, format: CsvFormat): List[String] =
def read(file: InputStream, format: CsvFormat): List[String] =
try
using(Source.fromInputStream(file, format.encoding)) { lines =>
val ls = if (format.ignoreHeader) {
......
......@@ -37,7 +37,7 @@ object StringUtils {
private val kvr: Regex = "(.*):(.*)".r
private val pattern: Pattern = Pattern.compile(regex.toString())
def extraJsonPairs(input: String): String = {
@inline private def extraJsonPairs(input: String): String = {
val matcher = pattern.matcher(input)
while (matcher.find) {
val tail = matcher.group().tail.init
......@@ -49,6 +49,9 @@ object StringUtils {
null
}
def asJsonString[K, V](kvs: Seq[(K, V)]): String =
s"""\"{${kvs.map(kv => s"""\"\"${kv._1}\"\":\"\"${kv._2}\"\"""").mkString(",")}}\""""
def extractJsonValues[T <: Product](jsonString: String)(func: (String, String) => T): List[T] = {
val pairs = extraJsonPairs(jsonString)
if (pairs == null) return Nil
......
......@@ -107,7 +107,7 @@ class ReaderBuilderMacro(override val c: whitebox.Context) extends AbstractMacro
q"""
..$getPreTree
..${getAnnoClassObject[T](clazzName, format)}
$packageName.FileUtils.reader($file, $format).map { ($innerLName: String) =>
$packageName.FileUtils.read($file, $format).map { ($innerLName: String) =>
$readerInstanceTermName.$innerTempTermName = ${TermName(innerLName.toString())}
$readerInstanceTermName.transform($innerLName)
}
......
......@@ -46,7 +46,7 @@ class WriterBuilderMacro(override val c: whitebox.Context) extends AbstractMacro
private val innerTName = q"_t"
private val innerTmpTermName = TermName("_tt")
private val writerInstanceTermName = TermName("_WriterInstance")
private val writerImplClassNamePrefix = "_CSVAnno$"
private val writerImplClassNamePrefix = "_WriterAnno$"
private val funcArgsTempTermName = TermName("temp")
// scalafmt: { maxColumn = 400 }
......@@ -101,7 +101,7 @@ class WriterBuilderMacro(override val c: whitebox.Context) extends AbstractMacro
q"""
..$preTrees
..${getAnnoClassObject[T](customTrees, format)}
$packageName.FileUtils.writer($file, $ts.map { ($innerTName: $clazzName) =>
$packageName.FileUtils.write($file, $ts.map { ($innerTName: $clazzName) =>
$writerInstanceTermName.$innerTmpTermName = $innerTName
$writerInstanceTermName.transform($innerTName)
}, $format
......
......@@ -61,15 +61,7 @@ class WriterAndReaderTest extends AnyFlatSpec with Matchers {
ReaderBuilder[Metric]
.setField(
_.dimensions,
dims => {
val jsonElements = dims
.replace("\"", "")
.split(",")
.map(_.replace("{", "").replace("}", ""))
println(jsonElements.toList)
val kvs = jsonElements.map(f => f.split(":")(0) -> f.split(":")(1))
kvs.map(kv => Dimension3(kv._1, kv._2)).toList
}
dims => StringUtils.extractJsonValues(dims)((k, v) => Dimension3(k, v))
)
.convert(csv)
)
......@@ -83,8 +75,7 @@ class WriterAndReaderTest extends AnyFlatSpec with Matchers {
WriterBuilder[Metric]
.setField(
_.dimensions,
(ds: List[Dimension3]) =>
s"""\"{${ds.map(kv => s"""\"\"${kv.key}\"\":\"\"${kv.value}\"\"""").mkString(",")}}\""""
(ds: List[Dimension3]) => StringUtils.asJsonString(ds.map(f => f.key -> f.value))
)
.convert(metric.get)
)
......@@ -103,15 +94,7 @@ class WriterAndReaderTest extends AnyFlatSpec with Matchers {
ReaderBuilder[Metric2]
.setField[Seq[Dimension3]](
_.dimensions,
dims => {
val jsonElements = dims
.replace("\"", "")
.split(",")
.map(_.replace("{", "").replace("}", ""))
println(jsonElements.toList)
val kvs = jsonElements.map(f => f.split(":")(0) -> f.split(":")(1))
kvs.map(kv => Dimension3(kv._1, kv._2)).toSeq
}
dims => StringUtils.extractJsonValues(dims)((k, v) => Dimension3(k, v))
)
.convert(csv)
)
......@@ -186,8 +169,7 @@ class WriterAndReaderTest extends AnyFlatSpec with Matchers {
val csv = WriterBuilder[Metric2]
.setField(
_.dimensions,
(ds: Seq[Dimension3]) =>
s"""\"{${ds.map(kv => s"""\"\"${kv.key}\"\":\"\"${kv.value}\"\"""").mkString(",")}}\""""
(ds: Seq[Dimension3]) => StringUtils.asJsonString(ds.map(f => f.key -> f.value).toList)
)
.convert(metrics.filter(_.isDefined).map(_.get))
......@@ -210,7 +192,7 @@ class WriterAndReaderTest extends AnyFlatSpec with Matchers {
WriterBuilder[Metric2]
.setField[Seq[Dimension3]](
_.dimensions,
ds => s"""\"{${ds.map(kv => s"""\"\"${kv.key}\"\":\"\"${kv.value}\"\"""").mkString(",")}}\""""
ds => StringUtils.asJsonString(ds.map(f => f.key -> f.value).toList)
)
.convertTo(metrics.filter(_.isDefined).map(_.get), file)
......@@ -238,7 +220,7 @@ class WriterAndReaderTest extends AnyFlatSpec with Matchers {
WriterBuilder[Metric2]
.setField[Seq[Dimension3]](
_.dimensions,
ds => s"""\"{${ds.map(kv => s"""\"\"${kv.key}\"\":\"\"${kv.value}\"\"""").mkString(",")}}\""""
ds => StringUtils.asJsonString(ds.map(f => f.key -> f.value).toList)
) // NOTE: not support pass anonymous object to convertTo method.
.convertTo(metrics.filter(_.isDefined).map(_.get), file)
file.delete()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册