我试图解析csv文件,我需要设置初始句点和最后句号的两个变量,但throws NumberFormatException
String line = null;
int initialPeriod = 0;
int finalPeriod = 0;
double sum = 0;
while ((line = br.readLine()) != null) {
String[] splitted = line.split(";");
int period = Integer.parseInt(splitted[0].split("-")[0]);
if (period < initialPeriod || initialPeriod == 0) {
initialPeriod = period;
}
if (period > finalPeriod || finalPeriod == 0) {
finalPeriod = period;
}
}
日期(在splitted[0]
中)的格式如下:
年 - 月 - 日小时:分钟
我只需要一年,所以我split splitted[0]
使用&#34; - &#34; char然后我将它转换为int但它抛出:
Exception in thread "main" java.lang.NumberFormatException: For input string: "2013"
(2013年是我档案的第一年)
这是堆栈跟踪:
Exception in thread "main" java.lang.NumberFormatException: For input string: "2013"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at it.tgi.exercise.parser.MainClassParser.main(MainClassParser.java:21)
答案 0 :(得分:2)
复制/粘贴给了我答案。
您的文件中没有标准的短划线,但却是一个特殊字符。
实际上,您的字段包含2013\u00AD
(因此长度为5)。 \u00AD
字符是一种连字符,但不是真的。
在CSV文件中硬键入短划线(-
)。
如果您要解析CSV中的日期,则应确保您拥有日期和所需的格式。
为此你应该使用以下内容(我假设你有标准的<year>-<month>-<day>
格式):
Java 7及以下
// Define before the loop, but careful to not share in other threads.
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
// The following lines should be in your loop
String dateField = ... ; // From CSV
Calendar calendar = new GregorianCalendar();
Date date= dateFormat.parse(dateField);
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
Java 8
// Define before the loop.
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE;
// The following lines should be in your loop
String dateField = ... ; // From CSV
LocalDate date = LocalDate.parse(dateField, formatter);
int year = date.getYear();
答案 1 :(得分:0)
尝试以下方法:
while ((line = br.readLine() )!= null) {
String [] splitted = line.split(";");
int period = Integer.parseInt(splitted[0].split("-")[0].trim());
if( period < initialPeriod || initialPeriod == 0)
initialPeriod = period;
if(period > finalPeriod || finalPeriod == 0)
finalPeriod =period;
}
你可能会遇到一些主要的白色标志。
修改强>
你可以在解析前添加它:System.out.println(splitted [o] .split(&#34; - &#34;)[0] .trim()。length()?给我们结果。是4吗?
结果是5。
答案 2 :(得分:0)
真正的问题是3 后面有一个隐形连字符。虽然你看不到它,但对于运行时来说,它只是一个与其他角色一样的角色。
尝试选择文本输入字符串,然后执行 shift + 向右箭头。您将看到光标位于某个位置。这意味着某处有一个未打印的角色。
您可能希望对您要检索的输入进行清理。没有人向你保证它在第五个位置总是不需要的角色,例如它也可以在第一个位置。因此请谨慎使用substring(0, 4)
。如果您的CSV包含更多&#34; false&#34;连字符而不是正常连字符,您可能希望将其包含在拆分模式中:
int yearStr = splitted[0].split("[-\u00AD]")[0];
Integer.parseInt(yearStr);
答案 3 :(得分:0)
问题是一个空白,因为我尝试使用.length,它说2013年有5个字符。 所以我使用.substring(0,4),现在它工作了!