Groovy - CSVParsing - Как разбить строку запятой вне двойных кавычек без использования внешних библиотек - PullRequest
0 голосов
/ 17 марта 2019

У меня есть файл CSV, как показано ниже

COL1, COL2, COL3, COL4
3920,10163, "ST. PAUL, MN", TWIN CITIES

Я хочу прочитатьфайл и разделить их вне двойных кавычек без использования каких-либо внешних библиотек.Например, в приведенном выше CSV нам нужно разделить их на 4 части как
1. 3920
2. 10163
3. ST.ПОЛ, MN
4. БЛИЗНЕЦЫ

Я пытался использовать регулярные выражения с последующим кодом, но никогда не работал.Я хочу сделать эту работу с помощью Groovy кода.Я пробовал разные решения, приведенные в Java.Но не смог достичь решения.

ПРИМЕЧАНИЕ: я не хочу использовать какие-либо внешние грааль / банки для этой работы.

def staticCSV = new File(staticMapping.csv")  
staticCSV.eachLine {line->
def parts = line.split(",(?=(?:[^\"]\"[^\"]\")[^\"]\${1})")
parts.each {
    println "${it}"
}
}

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

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

def content =
"""COL1,COL2,COL3,COL4
   3920,10163, "ST. PAUL, MN" ,TWIN CITIES
   3920,10163, "   ST. PAUL, MN " ,TWIN CITIES, ,"Bla,Bla, Bla" """  

content.eachLine {line ->
    def multiPart
    for (part in line.split(/,/)) {
        if (!part.trim()) continue         // for empty parts 
        if (part =~ /^\s*\"/) {            // beginning of a multipart
            multiPart = part
            continue
        } else if (part =~ /"\s*$/) {      // end of the multipart
            multiPart += "," + part
            println multiPart.replaceAll(/"/, "").trim()
            multiPart = null
            continue
        }        
        if (multiPart) {
            multiPart += "," + part
        } else {
            println part.trim()
        }        
    }
}

Вывод (Вы можете скопировать код прямо в GroovyConsole для запуска.

COL1
COL2
COL3
COL4
3920
10163
ST. PAUL, MN
TWIN CITIES
3920
10163
ST. PAUL, MN
TWIN CITIES
Bla,Bla, Bla
0 голосов
/ 18 марта 2019

Получил решение:

def getcsvListofListFromFile( String fileName ) {
    def lol = [] 
    def r1 = r1 = ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*\$)"  

    try {
        def csvf =  new File(fileName)  ;
        csvf.eachLine { line ->
            def c1 = line.split(r1)  
            def c2 = [] 
            c1.each { e1 ->
                def s = e1.toString() ;
                s = s.replaceAll('^"', "").replaceAll('"\$', "") 
                c2.add(s)
            }
            lol.add(c2) ;
        }
        return (lol)  
    } catch (Exception e) {
        def eMsg = "Error Reading file [" + fileName + "] --- " + e.getMessage();
        throw new RuntimeException(eMsg) 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...