Как преобразовать файл с пробелом в файл CSV в Scalar spark? - PullRequest
1 голос
/ 25 июня 2019

У меня есть CSV файл.Это мой ввод:

a _ \_ \ b_c b\_c "

Теперь я хочу преобразовать файл с пробелом в файл CSV.Что мне делать?

Не указанные поля считаются «Строка 0» и не заключаются в кавычки.

Это технические характеристики:

1.The string "_" by itself is converted to a null string.
( -n option changes "_" )

2.The string \c is converted to c.

3.The backslash character \ by itself is converted to a space

4.The underscore is converted to a space if it occurs in a string.
( -s option changes "_" )

5.\n at the end of a line is converted automatically to \r\n.

6.Within String 1, " is converted to "".

Я хочу получитьжелаемый результат вывода, как показано ниже.Пожалуйста, помогите мне.

"a","","_"," ","b c","b_c",""""

1 Ответ

1 голос
/ 25 июня 2019

Требования немного смущают меня, но вы можете попробовать это (что дает ожидаемый результат):

import scala.util.matching.Regex

val input = "a _ \\_ \\ b_c b\\_c \""

// List of replacements required (first replacement will be apply first)
val replacements: List[(Regex, String)] = List(
  ("""^_$""".r,         ""),
  ("""(?<!\\)_""".r,    " "),
  ("""\\(.)""".r,       "$1"),
  ("""\\""".r,          " "),
  (""""""".r,           "\"\""))

def applyReplacements(inputString: String, replacements: List[(Regex, String)]): String =
  replacements match {
    case Nil =>
      inputString
    case replacement :: tail => 
      applyReplacements(
        replacement._1.replaceAllIn(inputString, replacement._2),
        tail)
  }

def processLine(input: String): String = {
  val inputArray = input.split(" ")
  val outputArray = inputArray.map(x => applyReplacements(x, replacements))
  val finalLine = outputArray.map(x => s"""\"${x}\"""").mkString(",")

  // Use s"${finalLine}\r\n" instead if you need the '\r\n' ending
  finalLine
}

processLine(input)
// output:
// String = "a","","_"," ","b c","b_c",""""

Возможно, вам придется применить некоторые модификации, чтобы полностью адаптировать его к вашим требованиям (которые мне не совсем понятны).

Если вам нужно применить это к СДР Spark, вам нужно будет поставить processLine в map, чтобы он обрабатывал каждую строку в СДР.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...