3

生年月日がオプションの列であることを示すSuper CSV Web サイトのこの例を見ていました。オプションの列が複数ある場合はどうなりますか? コードはどのように変更されますか?

 private static void readVariableColumnsWithCsvListReader() throws Exception {

        final CellProcessor[] allProcessors = new CellProcessor[] { new UniqueHashCode(), // customerNo (must be unique)
                new NotNull(), // firstName
                new NotNull(), // lastName
                new ParseDate("dd/MM/yyyy") }; // birthDate

        final CellProcessor[] noBirthDateProcessors = new CellProcessor[] { allProcessors[0], // customerNo
                allProcessors[1], // firstName
                allProcessors[2] }; // lastName

        ICsvListReader listReader = null;
        try {
                listReader = new CsvListReader(new FileReader(VARIABLE_CSV_FILENAME), CsvPreference.STANDARD_PREFERENCE);

                listReader.getHeader(true); // skip the header (can't be used with CsvListReader)

                while( (listReader.read()) != null ) {

                        // use different processors depending on the number of columns
                        final CellProcessor[] processors;
                        if( listReader.length() == noBirthDateProcessors.length ) {
                                processors = noBirthDateProcessors;
                        } else {
                                processors = allProcessors;
                        }

                        final List<Object> customerList = listReader.executeProcessors(processors);
                        System.out.println(String.format("lineNo=%s, rowNo=%s, columns=%s, customerList=%s",
                                listReader.getLineNumber(), listReader.getRowNumber(), customerList.size(), customerList));
                }

        }
        finally {
                if( listReader != null ) {
                        listReader.close();
                }
        }
}

また、オプションの列が最後ではなく、中央または他の場所にある場合はどうなりますか?

4

1 に答える 1

2

したがって、ここでの本当の問題は、正しいセル プロセッサを適用するには、各列にどのようなデータがあるかを知る必要があるということです。有効な CSV ファイル (各行の列数が同じ) では問題ありませんが、可変列の CSV ファイルを扱う場合は注意が必要です。

例のように、1 列のみがオプションである場合は、読み取った列の数を数えて、セル プロセッサの適切な配列を使用するだけです。オプションの列がどこにあるかは問題ではありません。これは予測可能であるためです。

ただし、複数の列がオプションの場合、問題が発生します。たとえば、次の CSV ファイルでmiddleNameとがオプションの場合:city

firstName,middleName,lastName,city
Philip,Fry,New York

それは次のように読むことができます:

firstName="Philip", middleName="Fry", lastName="New York", city=null

また

firstName="Philip", middleName=null, lastName="Fry", city="New York"

もはや予測不可能です。列のデータを調べて、その列が何を表すか (たとえば、日付に が/ある) を判断できる場合がありますが、それはあまり堅牢ではありません。アウト。

于 2013-08-14T23:01:27.947 に答える