2015-08-12 11 views
7

W moim przypadku prawidłowy plik CSV jest rozdzielany przecinkiem lub średnikiem. Jestem otwarty na inne biblioteki, ale musi to być Java. Czytając API Apache CSVParser, jedyne co mogę zrobić, to zrobić to, co wydaje się nieefektywne i brzydkie.Jak przeanalizować plik CSV, który może mieć jeden z dwóch ograniczników?

try 
{ 
    BufferedReader reader = new BufferedReader(new InputStreamReader(file)); 
    CSVFormat csvFormat = CSVFormat.EXCEL.withHeader().withDelimiter(';'); 
    CSVParser parser = csvFormat.parse(reader); 
    // now read the records 
} 
catch (IOException eee) 
{ 
    try 
    { 
     // try the other valid delimeter 
     csvFormat = CSVFormat.EXCEL.withHeader().withDelimiter(','); 
     parser = csvFormat.parse(reader); 
     // now read the records 
    } 
    catch (IOException eee) 
    { 
     // then its really not a valid CSV file 
    } 
} 

Czy istnieje sposób, aby najpierw sprawdzić ogranicznik, a może pozwolić na dwa ograniczniki? Ktoś ma lepszy pomysł niż tylko wyłapanie wyjątku?

+0

myślę kody są najlepsze. Brak metody wykrywania separatora w normalnym pliku CSV. Jedynym sposobem na wykrycie separatora jest ponawianie próby z kilkoma ogranicznikami. – gilchris

+0

Pomyślnie, jeśli dobrze uformowałeś csv, mógłbyś dopasować wzór do jednej z twoich opcji? Jeśli każde pole jest zawijane w cudzysłów, a następnie oddzielone przecinkami, możesz znaleźć kilka przykładów wzorca "," –

Odpowiedz

2

Zbudowaliśmy poparcie dla tego w uniVocity-parsers:

public static void main(String... args) { 
    CsvParserSettings settings = new CsvParserSettings(); 
    settings.setDelimiterDetectionEnabled(true); 

    CsvParser parser = new CsvParser(settings); 

    List<String[]> rows = parser.parseAll(file); 

} 

Parser ma o wiele więcej możliwości, że jestem pewien, że znajdziesz użyteczne. Spróbuj.

Disclaimer: Jestem autorem tej biblioteki, to jest open source i free (licencja Apache 2.0)

+0

Awesome parser, zaoszczędził mi wiele bólu głowy. Dzięki za udostępnienie! – Buffalo

+0

Cieszę się, że mogę Ci pomóc! Rozważ umieszczenie pytania i odpowiedź, którą uznałeś za użyteczne. Twoje zdrowie! –

+0

Przetestowałem parser we wszystkich dziwnych plikach CSV i wszystko poszło dobrze. Próbowałem użyć zwykłego, prostego, "\ r \ n" oddzielonego pliku i to skleja nawet pierwsze 2-3 wiersze po nagłówku .. :(Automatyczne wykrywanie/dostarczanie separatora linii nie ma znaczenia – Buffalo