저는 CSV 파일을 구문 분석하려고하는데 문자열 값에서 시작하여 각 필드의 유형을 결정해야합니다. 예제닫기! 스칼라에서 문자열의 형식을 어떻게 감지 할 수 있습니까?
:
val row: Array[String] = Array("1/1/06 0:00","3108 OCCIDENTAL DR","3","3C","1115")
이 내가 얻을 것이 무엇인가 :
row(0) --> Date
row(1) --> String
row(2) --> Int
Ecc....
내가 어떻게 할 수 있습니까?
------------------------------------ 해결책 ------- -----------------------------
이것은 String, Date, Int 필드를 인식 한 해결책입니다. , Double 및 Boolean. 앞으로 누군가가 봉사 할 수 있기를 바랍니다.
def typeDetection(x: String): String = {
x match {
// Matches: [12], [-22], [0] Non-Matches: [2.2], [3F]
case int if int.matches("^-?[0-9]+$") => "Int"
// Matches: [2,2], [-2.3], [0.2232323232332] Non-Matches: [.2], [,2], [2.2.2]
case double if double.matches("^-?[0-9]+(,|.)[0-9]+$") => "Double"
// Matches: [29/02/2004 20:15:27], [29/2/04 8:9:5], [31/3/2004 9:20:17] Non-Matches: [29/02/2003 20:15:15], [2/29/04 20:15:15], [31/3/4 9:20:17]
case d1 if d1.matches("^((((31\\/(0?[13578]|1[02]))|((29|30)\\/(0?[1,3-9]|1[0-2])))\\/(1[6-9]|[2-9]\\d)?\\d{2})|(29\\/0?2\\/(((1[6-9]|[2-9]\\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))|(0?[1-9]|1\\d|2[0-8])\\/((0?[1-9])|(1[0-2]))\\/((1[6-9]|[2-9]\\d)?\\d{2})) *(?:(?:([01]?\\d|2[0-3])(\\-|:|\\.))?([0-5]?\\d)(\\-|:|\\.))?([0-5]?\\d)")
=> "Date"
// Matches: [01.1.02], [11-30-2001], [2/29/2000] Non-Matches: [02/29/01], [13/01/2002], [11/00/02]
case d2 if d2.matches("^(?:(?:(?:0?[13578]|1[02])(\\/|-|\\.)31)\\1|(?:(?:0?[1,3-9]|1[0-2])(\\/|-|\\.)(?:29|30)\\2))(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$|^(?:0?2(\\/|-|\\.)29\\3(?:(?:(?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\\/|-|\\.)(?:0?[1-9]|1\\d|2[0-8])\\4(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$")
=> "Date"
// Matches: [12/01/2002], [12/01/2002 12:32:10] Non-Matches: [32/12/2002], [12/13/2001], [12/02/06]
case d3 if d3.matches("^(([0-2]\\d|[3][0-1])(\\/|-|\\.)([0]\\d|[1][0-2])(\\/|-|\\.)[2][0]\\d{2})$|^(([0-2]\\d|[3][0-1])(\\/|-|\\.)([0]\\d|[1][0-2])(\\/|-|\\.)[2][0]\\d{2}\\s([0-1]\\d|[2][0-3])\\:[0-5]\\d\\:[0-5]\\d)$")
=> "Date"
case boolean if boolean.equalsIgnoreCase("true") || boolean.equalsIgnoreCase("false") => "Boolean"
case _ => "String"
}
}
다음 REPL/워크 시트에서
? IOW, 필드가 날짜, int 또는 문자열인지 여부를 미리 알지 못하면 그 데이터를 사용하기 위해 무엇을 사용할 수 있습니까? – jwg
Hello @jwg, 내부에있는 내용이 포함 된 CSV 파일을 분석 중입니다. CSV는 사례 클래스를 채울 분할기로 이동합니다. 필자는 각 열의 구조를 열 수준 구조로 저장해야하기 때문에 각 필드의 형식을 인식해야합니다. 그것은 내가 선택한 자신의 상황에 내재하는 고유 한 선택입니다. – YoBre
그러나 테이블이나 개체에 저장 한 데이터로 무엇을하고 있습니까? 여전히 문자열 인 경우에는 할 수 없었습니다. – jwg