Как записать в лист CSV с нижеуказанным конкретным форматом - PullRequest
0 голосов
/ 23 мая 2018

Нам нужно получить формат ниже

Redemption Reference Code|Status|Delivery company|Shipper Tracking Number|Comments
2006995040|Shipped|USPS|ABCD12345|Order SHIPPED
2006995042|Cancelled|||INVALID Address
2006995048|Ordered|USPS|ABCD12345|Order SHIPPED

Я использую код ниже

private void accumulateOrdersFromPlacement(){
        int count = 0;
        for (int i = 0; i < orderIds.size(); i++) {


            if (count == 0) {
                outPutLineData.add(orderIds.get(i));
                outPutLineData.add("Cancelled");
                outPutLineData.add("");
                outPutLineData.add(" ");
               outPutLineData.add(" ");
                cancelledStatusLineItems.add(orderIds.get(i));
                count++;
            } else if (count == 1) {
                outPutLineData.add(orderIds.get(i));
                outPutLineData.add("Shipped");
                if (outPutLineData.contains("Shipped")) {
                    outPutLineData.add("USPS");
                    outPutLineData.add("order SHIPPED");
                    outPutLineData.add("");
                }
                shippedStatusLineItems.add(orderIds.get(i));
                count++;
            } else if (count == 2) {
                outPutLineData.add(orderIds.get(i));
                outPutLineData.add("No Longer Available");
                outPutLineData.add("");
                outPutLineData.add(" ");
                outPutLineData.add(" ");
                count++;
                nlaStatusLineItems.add(orderIds.get(i));
            } else if (count == 3) {
                outPutLineData.add(orderIds.get(i));
                outPutLineData.add("Ordered");
                outPutLineData.add("");
                outPutLineData.add(" ");
                outPutLineData.add(" ");
                orderedStatusLineItems.add(orderIds.get(i));
                count = 0;
            }
        }

Я использую код ниже для создания файлов.Это подробная кодировка.Это более читабельно для понимания кода. Здесь я запутался в коде. Мы принимаем подсчет идентификатора заказа и основываясь на том, что этот код работает.

private File createFile(final File directory) {
    FileWriter fw = null;
    File tempFile = null;
    try {
        directory.mkdir();

       tempFile = new File(".//FidelityFulfillment//" + generateFileName(countyThreeLetterCode, "FidelityFulfillment", ".csv", date));
        logReport(GenericConstants.NEW_LINE + "Fulfillment file creating:", tempFile.getName());
        fw = new FileWriter(tempFile, true);
        try (BufferedWriter writer  = new BufferedWriter(new FileWriter(tempFile, true))) {
            writer.write(generateHeaderLine());
            writer.newLine();


           for (int y = 1; y < outPutLineData.size(); y++) {

                if (y % 5 < 4) {  

                     writer.write(outPutLineData.get(y-1) + fieldSeperator);
                     logReport(outPutLineData.get(y - 1) + fieldSeperator);
                }
                else {

                     writer.write(outPutLineData.get(y-1));
                    logReport(outPutLineData.get(y));
                }
                 if (y % 5 == 0) {
                     writer.newLine();
                     logReport("newline");
                 }  
            }



            writer.close();
        } catch (final IOException e) {
            e.printStackTrace();
            final String err = "Unable to write file due to : " + e;
            logReport(GenericConstants.NEW_LINE + "Unable to create temp local File");
        } finally {
            fw.close();
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    return tempFile;
}

Получение ответа как

Redemption Reference Code|Status|Delivery company|ShipperTrackingNumber|Comments
2006964032|Cancelled|| |
newline
2006964034|Shipped|USPS||
newline
2006964036|No Longer Available||

Последняя строка первой линии пропадает

1 Ответ

0 голосов
/ 23 мая 2018

Сначала вы выполняете странный цикл:

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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...