在 java 中读取流文件
Read streamfile in java
我正在处理逗号分隔值file.i想从每个原始数据中提取第一个位置[数组中的“0”位置]值,并想对其进行一些数学计算。
csv inputfile is like this
a,b,c,d
12,32,45,76
23,45,77,56
32,34,49,28
73,92,26,68
73,36,77,26
为了获得第一名,它给我这样的错误
Exception in thread "main" java.lang.NumberFormatException: For input string: ""12"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1268)
at java.lang.Double.parseDouble(Double.java:548)
at rotation.pkg45.Rotation45.main(Rotation45.java:49)//code line no-49
它在第二和第三位置上工作正常,但对于第四位置它给出与第一位置相同的错误。
package rotation.pkg45;import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.FileWriter;
import java.io.*;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
public class Rotation45 {
public static void main(String[] args)throws IOException {
String filename = "bank-full2.csv";
ArrayList<String> namesList = new ArrayList<String>( );
String[] t1;
// StringBuilder sb;
List<Double> list = new ArrayList<Double>();
File file = new File(filename);
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter("bank2test1.csv"));
double a1=0.866025;
double a2=0.5;
double a3=-0.5;
double a4=0.866025;
double b1;
double b2;
double c1;
double c2;
Scanner inputStream = new Scanner(file);
inputStream.next();
Scanner inputStreamm = new Scanner(file);
inputStreamm.next();
while (inputStreamm.hasNext()) { //while loop for find MEAN
String data = inputStreamm.next(); //read each line and store in data
String[] values = data.split(","); //every line splited with " ; " and store each attribute in string list
double first = Double.parseDouble(values[1]);
/* no suchelementexeption */ String data1 = inputStreamm.next(); //read each line and store in data
String[] values1 = data1.split(",");
//inputStream.next();
double second = Double.parseDouble(values1[1]);
c1= ((a2*second)+(a1*first));
c2= ((a3*first)+(a4*second));
values1[2] = String.valueOf(c2);
values[2] = String.valueOf(c1);
StringBuilder sb = new StringBuilder();
// String newData = sb.toString();
for (int i = 0; i<values.length ; i++) {
sb.append(values[i]);
if (i < values.length - 1) {
sb.append(",");
}
}
sb.append("\n");
for (int i = 0; i<values1.length ; i++) {
sb.append(values1[i]);
if (i < values.length - 1) {
sb.append(",");
}
}
// get the new string
// System.out.println(sb.toString());
writer.write(sb.toString()+"\n");
}
writer.close();
inputStreamm.close();
}
catch (FileNotFoundException ex)
{
Logger.getLogger(Rotation45.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
例如,这里我提取了值[1](表示数组中的第二个位置,如 32、45、34,..)
so result will be..
12,34,45,76
23,46,77,56
32,36,49,28
73,93,26,68
73,38,77,26
此代码适用于值[1]和值[2],不适用于值[0]和值[3]..为什么我不明白请帮助我...
因为值[1]和值[2]有引号,你应该String.replaceAll()引号。
我能注意到各种问题:
Scanner inputStream = new Scanner(file);
inputStream.next();
Scanner inputStreamm = new Scanner(file);
inputStreamm.next();
为什么要声明和实例化 inputStream
两次?
你想用这个做什么:
String data = inputStreamm.next(); //read each line and store in data
String[] values = data.split(","); //every line splited with " ; " and store each attribute in string list
double first = Double.parseDouble(values[1]);
first=first+2;
String data1 = inputStreamm.next(); //read each line and store in data
String[] values1 = data1.split(",");
//inputStream.next();
double second = Double.parseDouble(values1[1]);
second=second+1;
我闻到了重复的味道。
编辑:我很快编写了一个程序来为您完成这项工作:
public static void main(String[] args) {
String csvFile = "src/files/text/simple.csv";
BufferedReader br = null;
String line = "";
String cvsSplitBy = ",";
boolean readingHeader = true;
String integerValues = "";
try {
br = new BufferedReader(new FileReader(csvFile));
while ((line = br.readLine()) != null) {
// use comma as separator
if(readingHeader) {
readingHeader = false;
continue;
}
String[] values = line.split(cvsSplitBy); // we get ints here.
integerValues = integerValues + values[0] + ",";
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println(integerValues);
}
它打印:12,23,32,73,73,
。你需要做一些清理,但它会给你想法。
当您阅读该行时,它显然 returns 带有引号,例如:
"12,32,45,76"
所以当你拆分它时,你会得到以下元素:
"12
32
45
76"
如您所见,行中的第一个和最后一个元素不是数字,因此您的 Double.ParseDouble(..) 调用失败。
您应该修改原始字符串(通过对其进行子字符串化或更好地使用 .reaplce("\"", ""))或在拆分后检查每个元素然后替换 /trim 引号。
您的代码在生成异常和可读性方面存在一些问题。
我重写了您的代码,它正在运行:
package rotation.pkg45;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Rotation45 {
public static void main(String[] args) throws IOException {
String filename = "bank-full2.csv";
File file = new File(filename);
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter("bank2test1.csv"));
Scanner inputStreamm = new Scanner(file);
inputStreamm.nextLine();
while (inputStreamm.hasNext()) { // while loop for find MEAN
String data = inputStreamm.nextLine(); // read each line and store in data
String[] values = data.split(","); // every line splited with " , " and store each attribute in string list
// double value is generating 34.0 value, and you are expecting only 34
// double first = Double.parseDouble(values[1]);
int first = Integer.parseInt(values[1]);
first = first + 2;
values[1] = String.valueOf(first);
StringBuilder sb = new StringBuilder();
// String newData = sb.toString();
for (int i = 0; i < values.length; i++) {
sb.append(values[i]);
if (i < values.length - 1) {
sb.append(",");
}
}
if (inputStreamm.hasNext()) { /* To handle NoSuchElementException */
String data1 = inputStreamm.nextLine(); // read each line and store in data
String[] values1 = data1.split(",");
// double second = Double.parseDouble(values1[1]);
int second = Integer.parseInt(values1[1]);
second = second + 1;
values1[1] = String.valueOf(second);
sb.append("\n");
for (int i = 0; i < values1.length; i++) {
sb.append(values1[i]);
if (i < values.length - 1) {
sb.append(",");
}
}
}
writer.write(sb.toString() + "\n");
}
writer.close();
inputStreamm.close();
} catch (FileNotFoundException ex) {
Logger.getLogger(Rotation45.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
CSV 输入文件:
a,b,c,d
12,32,45,76
23,45,77,56
32,34,49,28
73,92,26,68
73,36,77,26
CSV 输出文件:
12,34,45,76
23,46,77,56
32,36,49,28
73,93,26,68
73,38,77,26
所做的更改是:
- Replaced
inputStreamm.next();
with inputStreamm.nextLine();
- Code refactored. Processing of
values
is done first and then values1
.
- Added
if (inputStreamm.hasNext())
to handle NoSuchElementException
.
- Replaced
Double.parseDouble(values1[1]);
with Integer.parseInt(values1[1]);
, as it was generating 34.0
and you wanted 34
in your output file.
我正在处理逗号分隔值file.i想从每个原始数据中提取第一个位置[数组中的“0”位置]值,并想对其进行一些数学计算。
csv inputfile is like this
a,b,c,d
12,32,45,76
23,45,77,56
32,34,49,28
73,92,26,68
73,36,77,26
为了获得第一名,它给我这样的错误
Exception in thread "main" java.lang.NumberFormatException: For input string: ""12"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1268)
at java.lang.Double.parseDouble(Double.java:548)
at rotation.pkg45.Rotation45.main(Rotation45.java:49)//code line no-49
它在第二和第三位置上工作正常,但对于第四位置它给出与第一位置相同的错误。
package rotation.pkg45;import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.FileWriter;
import java.io.*;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.ListIterator;
public class Rotation45 {
public static void main(String[] args)throws IOException {
String filename = "bank-full2.csv";
ArrayList<String> namesList = new ArrayList<String>( );
String[] t1;
// StringBuilder sb;
List<Double> list = new ArrayList<Double>();
File file = new File(filename);
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter("bank2test1.csv"));
double a1=0.866025;
double a2=0.5;
double a3=-0.5;
double a4=0.866025;
double b1;
double b2;
double c1;
double c2;
Scanner inputStream = new Scanner(file);
inputStream.next();
Scanner inputStreamm = new Scanner(file);
inputStreamm.next();
while (inputStreamm.hasNext()) { //while loop for find MEAN
String data = inputStreamm.next(); //read each line and store in data
String[] values = data.split(","); //every line splited with " ; " and store each attribute in string list
double first = Double.parseDouble(values[1]);
/* no suchelementexeption */ String data1 = inputStreamm.next(); //read each line and store in data
String[] values1 = data1.split(",");
//inputStream.next();
double second = Double.parseDouble(values1[1]);
c1= ((a2*second)+(a1*first));
c2= ((a3*first)+(a4*second));
values1[2] = String.valueOf(c2);
values[2] = String.valueOf(c1);
StringBuilder sb = new StringBuilder();
// String newData = sb.toString();
for (int i = 0; i<values.length ; i++) {
sb.append(values[i]);
if (i < values.length - 1) {
sb.append(",");
}
}
sb.append("\n");
for (int i = 0; i<values1.length ; i++) {
sb.append(values1[i]);
if (i < values.length - 1) {
sb.append(",");
}
}
// get the new string
// System.out.println(sb.toString());
writer.write(sb.toString()+"\n");
}
writer.close();
inputStreamm.close();
}
catch (FileNotFoundException ex)
{
Logger.getLogger(Rotation45.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
例如,这里我提取了值[1](表示数组中的第二个位置,如 32、45、34,..)
so result will be..
12,34,45,76
23,46,77,56
32,36,49,28
73,93,26,68
73,38,77,26
此代码适用于值[1]和值[2],不适用于值[0]和值[3]..为什么我不明白请帮助我...
因为值[1]和值[2]有引号,你应该String.replaceAll()引号。
我能注意到各种问题:
Scanner inputStream = new Scanner(file);
inputStream.next();
Scanner inputStreamm = new Scanner(file);
inputStreamm.next();
为什么要声明和实例化 inputStream
两次?
你想用这个做什么:
String data = inputStreamm.next(); //read each line and store in data
String[] values = data.split(","); //every line splited with " ; " and store each attribute in string list
double first = Double.parseDouble(values[1]);
first=first+2;
String data1 = inputStreamm.next(); //read each line and store in data
String[] values1 = data1.split(",");
//inputStream.next();
double second = Double.parseDouble(values1[1]);
second=second+1;
我闻到了重复的味道。
编辑:我很快编写了一个程序来为您完成这项工作:
public static void main(String[] args) {
String csvFile = "src/files/text/simple.csv";
BufferedReader br = null;
String line = "";
String cvsSplitBy = ",";
boolean readingHeader = true;
String integerValues = "";
try {
br = new BufferedReader(new FileReader(csvFile));
while ((line = br.readLine()) != null) {
// use comma as separator
if(readingHeader) {
readingHeader = false;
continue;
}
String[] values = line.split(cvsSplitBy); // we get ints here.
integerValues = integerValues + values[0] + ",";
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
System.out.println(integerValues);
}
它打印:12,23,32,73,73,
。你需要做一些清理,但它会给你想法。
当您阅读该行时,它显然 returns 带有引号,例如:
"12,32,45,76"
所以当你拆分它时,你会得到以下元素:
"12
32
45
76"
如您所见,行中的第一个和最后一个元素不是数字,因此您的 Double.ParseDouble(..) 调用失败。
您应该修改原始字符串(通过对其进行子字符串化或更好地使用 .reaplce("\"", ""))或在拆分后检查每个元素然后替换 /trim 引号。
您的代码在生成异常和可读性方面存在一些问题。
我重写了您的代码,它正在运行:
package rotation.pkg45;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Rotation45 {
public static void main(String[] args) throws IOException {
String filename = "bank-full2.csv";
File file = new File(filename);
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter("bank2test1.csv"));
Scanner inputStreamm = new Scanner(file);
inputStreamm.nextLine();
while (inputStreamm.hasNext()) { // while loop for find MEAN
String data = inputStreamm.nextLine(); // read each line and store in data
String[] values = data.split(","); // every line splited with " , " and store each attribute in string list
// double value is generating 34.0 value, and you are expecting only 34
// double first = Double.parseDouble(values[1]);
int first = Integer.parseInt(values[1]);
first = first + 2;
values[1] = String.valueOf(first);
StringBuilder sb = new StringBuilder();
// String newData = sb.toString();
for (int i = 0; i < values.length; i++) {
sb.append(values[i]);
if (i < values.length - 1) {
sb.append(",");
}
}
if (inputStreamm.hasNext()) { /* To handle NoSuchElementException */
String data1 = inputStreamm.nextLine(); // read each line and store in data
String[] values1 = data1.split(",");
// double second = Double.parseDouble(values1[1]);
int second = Integer.parseInt(values1[1]);
second = second + 1;
values1[1] = String.valueOf(second);
sb.append("\n");
for (int i = 0; i < values1.length; i++) {
sb.append(values1[i]);
if (i < values.length - 1) {
sb.append(",");
}
}
}
writer.write(sb.toString() + "\n");
}
writer.close();
inputStreamm.close();
} catch (FileNotFoundException ex) {
Logger.getLogger(Rotation45.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
CSV 输入文件:
a,b,c,d
12,32,45,76
23,45,77,56
32,34,49,28
73,92,26,68
73,36,77,26
CSV 输出文件:
12,34,45,76
23,46,77,56
32,36,49,28
73,93,26,68
73,38,77,26
所做的更改是:
- Replaced
inputStreamm.next();
withinputStreamm.nextLine();
- Code refactored. Processing of
values
is done first and thenvalues1
.- Added
if (inputStreamm.hasNext())
to handleNoSuchElementException
.- Replaced
Double.parseDouble(values1[1]);
withInteger.parseInt(values1[1]);
, as it was generating34.0
and you wanted34
in your output file.