Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用OpenCSV读取长单元格值?_Java_Opencsv - Fatal编程技术网

Java 如何使用OpenCSV读取长单元格值?

Java 如何使用OpenCSV读取长单元格值?,java,opencsv,Java,Opencsv,我正在导入csv文件。我有一个单元格值,比如导入时的1.00E+13,必须读取为100230000000(实际扩展值)。 我正在使用OpenCSV 注意:我是通过对XLS和XLSX文件使用ApachePOI实现的,因为POI不支持CSV,所以我使用的是OpenCSV POI针对上述情况的解决方案是: FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator(hWorkbook); HSSFCell cellValue = ro

我正在导入csv文件。我有一个单元格值,比如导入时的1.00E+13,必须读取为100230000000(实际扩展值)。 我正在使用OpenCSV

注意:我是通过对XLS和XLSX文件使用ApachePOI实现的,因为POI不支持CSV,所以我使用的是OpenCSV

POI针对上述情况的解决方案是:

FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator(hWorkbook);
HSSFCell cellValue = row.getCell(1);   //input as 1.00E+13
objFormulaEvaluator.evaluate(cellValue); //result as 10023000000000
如何在OpenCSV中实现这一点


提前感谢。

如果您自己解析csvReader中的字符串,那么Kenny的答案就完全正确了。我唯一关心的是csv文件是字符串,因此输入必须是1.0023E+13,而不是1.00E+13

所有这些都表明在opencsv中还有另一种方式,那就是CsvToBean类。您使用公共getter和setter创建一个具有所需值的类,然后CsvToBean将为您处理转换,如下面的通过测试所示

public class CsvToBeanDoubleTest {

    private static final double DOUBLE_NUMBER = 10023000000000d;

    private static final String TEST_STRING = "name,orderNumber,doubleNum\n" +
            "kyle,abc123456,10023000000000\n" +
            "jimmy,def098765,1.0023E+13 ";

    private CSVReader createReader() {
        return createReader(TEST_STRING);
    }

    private CSVReader createReader(String testString) {
        StringReader reader = new StringReader(testString);
        return new CSVReader(reader);
    }

    private MockBean createMockBean(String name, String orderNumber, double num) {
        MockBean mockBean = new MockBean();
        mockBean.setName(name);
        mockBean.setOrderNumber(orderNumber);
        mockBean.setDoubleNum(num);
        return mockBean;
    }

    @Test
    public void parseBeanWithNoAnnotations() {
        HeaderColumnNameMappingStrategy<MockBean> strategy = new HeaderColumnNameMappingStrategy<MockBean>();
        strategy.setType(MockBean.class);
        CsvToBean<MockBean> bean = new CsvToBean<MockBean>();

        List<MockBean> beanList = bean.parse(strategy, createReader());
        assertEquals(2, beanList.size());
        assertTrue(beanList.contains(createMockBean("kyle", "abc123456", DOUBLE_NUMBER)));
        assertTrue(beanList.contains(createMockBean("jimmy", "def098765", DOUBLE_NUMBER)));
    }
}
公共类CsvToBeanDoubleTest{
私有静态最终双精度编号=100230000000d;
私有静态最终字符串测试\u String=“name,orderNumber,doubleNum\n”+
凯尔,ABC12345610023000000000\n+
“吉米,def098765,1.0023E+13”;
私有CSVReader createReader(){
返回createReader(测试字符串);
}
私有CSVReader createReader(字符串测试字符串){
StringReader=新的StringReader(testString);
返回新的CSVReader(读卡器);
}
私有MockBean createMockBean(字符串名称、字符串顺序号、双数值){
MockBean MockBean=新MockBean();
mockBean.setName(name);
setOrderNumber(orderNumber);
setDoubleNum(num);
返回mockBean;
}
@试验
public void parseBeanWithNoAnnotations(){
HeaderColumnNameMappingStrategy=新建HeaderColumnNameMappingStrategy();
setType(MockBean.class);
CsvToBean=新的CsvToBean();
List beanList=bean.parse(策略,createReader());
assertEquals(2,beanList.size());
assertTrue(beanList.contains(createMockBean(“kyle”,“abc123456”,双_编号));
assertTrue(beanList.contains(createMockBean(“jimmy”,“def098765”,双_编号));
}
}

如果您自己解析csvReader中的字符串,那么Kenny的答案是完全正确的。我唯一关心的是csv文件是字符串,因此输入必须是1.0023E+13,而不是1.00E+13

所有这些都表明在opencsv中还有另一种方式,那就是CsvToBean类。您使用公共getter和setter创建一个具有所需值的类,然后CsvToBean将为您处理转换,如下面的通过测试所示

public class CsvToBeanDoubleTest {

    private static final double DOUBLE_NUMBER = 10023000000000d;

    private static final String TEST_STRING = "name,orderNumber,doubleNum\n" +
            "kyle,abc123456,10023000000000\n" +
            "jimmy,def098765,1.0023E+13 ";

    private CSVReader createReader() {
        return createReader(TEST_STRING);
    }

    private CSVReader createReader(String testString) {
        StringReader reader = new StringReader(testString);
        return new CSVReader(reader);
    }

    private MockBean createMockBean(String name, String orderNumber, double num) {
        MockBean mockBean = new MockBean();
        mockBean.setName(name);
        mockBean.setOrderNumber(orderNumber);
        mockBean.setDoubleNum(num);
        return mockBean;
    }

    @Test
    public void parseBeanWithNoAnnotations() {
        HeaderColumnNameMappingStrategy<MockBean> strategy = new HeaderColumnNameMappingStrategy<MockBean>();
        strategy.setType(MockBean.class);
        CsvToBean<MockBean> bean = new CsvToBean<MockBean>();

        List<MockBean> beanList = bean.parse(strategy, createReader());
        assertEquals(2, beanList.size());
        assertTrue(beanList.contains(createMockBean("kyle", "abc123456", DOUBLE_NUMBER)));
        assertTrue(beanList.contains(createMockBean("jimmy", "def098765", DOUBLE_NUMBER)));
    }
}
公共类CsvToBeanDoubleTest{
私有静态最终双精度编号=100230000000d;
私有静态最终字符串测试\u String=“name,orderNumber,doubleNum\n”+
凯尔,ABC12345610023000000000\n+
“吉米,def098765,1.0023E+13”;
私有CSVReader createReader(){
返回createReader(测试字符串);
}
私有CSVReader createReader(字符串测试字符串){
StringReader=新的StringReader(testString);
返回新的CSVReader(读卡器);
}
私有MockBean createMockBean(字符串名称、字符串顺序号、双数值){
MockBean MockBean=新MockBean();
mockBean.setName(name);
setOrderNumber(orderNumber);
setDoubleNum(num);
返回mockBean;
}
@试验
public void parseBeanWithNoAnnotations(){
HeaderColumnNameMappingStrategy=新建HeaderColumnNameMappingStrategy();
setType(MockBean.class);
CsvToBean=新的CsvToBean();
List beanList=bean.parse(策略,createReader());
assertEquals(2,beanList.size());
assertTrue(beanList.contains(createMockBean(“kyle”,“abc123456”,双_编号));
assertTrue(beanList.contains(createMockBean(“jimmy”,“def098765”,双_编号));
}
}

您可能需要自己动手制作类似于
(long)Double.parseDouble(“1.00E+13”)(long)Double.parseDouble(“1.00E+13”)