2010-06-29 2 views
3

Я работаю с Super CSV и выглядит как удивительный пакет.Super CSV (Java) - Чтение файлов с пробелами в именах столбцов

Мое единственное беспокойство - как работать с колонками с пробелами в их именах. Нет, я не могу вернуться и снять пространство. Эти файлы будут переданы мне сотнями, и у меня нет времени вернуться и исправить все 60 столбцов для каждого файла, и я не могу доверять всем остальным, чтобы сделать это правильно.

Как я могу работать с столбцами с пробелами в заголовке (т. Е. «Имя», а не «FirstName» или «firstName»)?

Спасибо!

Для кодирования образцов, смотрите здесь: http://supercsv.sourceforge.net/codeExamples_general.html

+0

CSV является разделенным запятыми-значения, так что не должно быть никакой проблемы с пробелами в именах полей. Почему вы предлагаете, чтобы они были «исправлены», если у вас было время? Может быть, имена полей «предположительно» имеют пробелы, и если вы их удалите, это будет ошибка? – maxwellb

+0

Я в замешательстве. Какие? Мне разрешено изменять данные, как мне нравится, и я знаю, что это будет работать без пробелов. Что значит «предположительно» иметь пробелы. Файлы csv, которые я использую, не были разработаны для этого автоматизированного процесса, их просто в файле. –

+0

Я извиняюсь. Когда вы сказали «как я должен работать с пробелами в названии», я подумал, что, возможно, вы не смогли правильно разобрать имена полей. Если вы не читаете заголовок, все будет позиционным с этого момента, и вы можете использовать заголовки, если вы их читаете, в качестве намеков на то, что означает позиция в строках CSV, что соответствует вашим потребностям конкретного приложения. – maxwellb

ответ

2

Вы заметили эту линию в образцах вы ссылка на:

final String[] header = inFile.getCSVHeader(true); 

Это должно дать вам ваши имена столбцов, нет?

http://supercsv.sourceforge.net/javadoc/index.html

Я думаю, что я понимаю ваш вопрос сейчас. Аргумент String [], переданный функции read, принимает имена свойств класса, который вы хотите прочитать. Он позиционный, поэтому его не нужно называть как заголовки. Так, например, вы можете иметь String[] header = inFile.getCSVHeader(), но есть отображение headerName->propertyName, поэтому, если ваши поля заголовка были:

First Name, Last Name, Age 

но ваш класс был

getFirstName(), setFirstName(...); 
getLastName(), setLastName(...); 
getYears(), setYears(); 

передача методу read не (String[]) {"First Name", "Last Name", "Age"}, как ваш заголовок, но перейдите к read, a (String[]) {"FirstName", "LastName", "Years"}.

+0

Посмотрите на класс UserBean. Не соответствует ли имя столбца переменным? Я немного смущен тем, что происходит во время цикла. –

+0

Что я говорю, обратите внимание на то, как он использует заголовки «имя пользователя», «пароль» и т. Д. Они непосредственно соответствуют переменным имени пользователя и паролю. У меня есть «Имя» в качестве заголовка и не может иметь имя в качестве переменной (пробелы не допускаются + плохое форматирование). –

+0

теперь обновлено, что я понимаю – maxwellb

2

Если вы хотите сопоставить заголовок CSV с другим именем, вы можете создать хеш-карту и использовать ее для своей внутренней реализации, например. вы можете сопоставить «Имя» с «firstName» и заполнить свой bean-компонент на основе ваших внутренних имен.

+1

Это похоже на то, что я ищу. Можете ли вы мне немного помочь? Я действительно не знаком с этим. Благодаря! :) –

+0

Надеюсь, вы получили решение, предложенное maxwellb .. –

1

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

final String[] header = beanReader.getHeader(true); 

    for(int i = 0; i <= header.length -1 ; i++) { 
    header[i] = header[i].replaceAll("[^a-zA-Z0-9]+",""); 
    } 
1

Чтобы иметь заголовок с пробелами отделить отображение компонента и массив заголовков.

private final String[] header = new String[] { "First Name", "Last Name"}; private final String[] dataMapping = new String[] { "firstName", "lastName"}; beanWriter = new CsvBeanWriter(new FileWriter(path), CsvPreference.EXCEL_PREFERENCE); beanWriter.writeHeader(header); beanWriter.write(yourPojo, dataMapping, processors);

Смежные вопросы