Сначала вы выполняете странный цикл:
for (int y = 1; y < outPutLineData.size(); y++) {
Обычно мы начинаем с 0.
Но вы пытались исправить это с помощью условия:
if (y % 5 < 4) {
//System.out.print("size:"+y);
writer.write(outPutLineData.get(y-1) + fieldSeperator);
logReport(outPutLineData.get(y - 1) + fieldSeperator);
}
else {
//System.out.print("size noseperator:"+y);
writer.write(outPutLineData.get(y-1));
logReport(outPutLineData.get(y));
}
Вместо этого просто используйте итератор для чтения значений, а затем при чтении правильного количества значений:
Iterator<String> it = outPutLineData.iterator();
while(it.hasNext()){
for (int j = 0; j < columnCount; ++j) {
writer.write(it.next());
if( j < columnCount - 1)
writer.write(fieldSeperator);
}
writer.newLine();
}
Пример с StringBuilder
для печати в консоли:
int columnCount = 2;
String fieldSeperator = "|";
List<String> list = Arrays.asList("foo", "1", "bar", "2");
Iterator<String> it = list.iterator();
//Safe guard !
if(list.size() % columnCount != 0)
throw new RuntimeException("The list does have the correct amount of data");
while(it.hasNext()){
for (int j = 0; j < columnCount; ++j) {
sb.append( it.next() );
if( j < columnCount - 1)
sb.append(fieldSeperator );
}
System.out.println(sb.toString());
sb.setLength(0);
}
foo | 1
bar | 2
Использование POJO
Вы используете List<String>
для хранения значений, которые вам нужнызнать, сколько столбцов нужно прочитать, чтобы получить значение.Вместо этого используйте POJO:
public class Redemption{
String redemptionReference;
String code;
String status;
String deliveryCompany;
String shipperTrackingNumber;
String comments;
}
И создайте экземпляр в вашем первом цикле:
List<Redemption> list...
Таким образом, вам просто нужно перебрать каждый экземпляр для построения вашей строки:
for(Redemption r: list){
writer.write(r.getRedemptionReference() + fieldSeperator);
...
writer.write(r.getComments());
writer.newLine();
}
Конечно, вам нужно использовать геттер и сеттер, но это только для того, чтобы показать, что вы должны делать.
CSV API
Большое предупреждение, написание вашегоСобственный писатель CSV опасен.Если у вас есть комментарий как "This is a | character"
.Вы получите строку вроде:
2006995040|Shipped|USPS|This is a | character|Order SHIPPED
Этот один столбец для многих ... потому что у вас должно быть
2006995040|Shipped|USPS|"This is a | character"|Order SHIPPED
Но вы не проверяете этот случай, и этотолько один случай.Использовать API CSV безопаснее и проще.
См. Любая хорошая библиотека для чтения и записи файлов CSV?