在 csv 文件末尾追加列 java
Appending column at the end of a csv file java
我有一个 csv 文件,里面有一些数据,我想在里面追加一列。例如:
Name,Age,Marks
Joe,15,1
Smith,20,2
我想通过代码附加该标记列。我遇到的问题是
Name,Age,Marks
Joe,15
1
2
Smith,20
1
2
数据被写入 2 次,并且在第一列(除了第一列)。我怎样才能阻止它这样做?过去 1 周我一直陷入这个问题
我的代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class appendCol {
public static String appendingCol() {
String stringArray[] = {"Marks", "1", "2"};
StringBuilder sb = new StringBuilder();
for (int i = 0; i < stringArray.length; i++) {
sb.append(stringArray[i]);
}
String str = sb.toString();
return str;
}
public static void main(String[] args) throws IOException {
String line = "";
BufferedWriter writer = new BufferedWriter(new FileWriter("D:\temp.csv"));
try (BufferedReader br = new BufferedReader(new FileReader("D:\text1.csv"))) {
while ((line = br.readLine()) != null) {
String newFileLine = line + "," + appendingCol();
writer.write(newFileLine);
writer.newLine();
}
}
writer.close();
}
}
header 需要与值分开处理。
public static void main(String[] args) throws IOException {
Map<String, String[]> csvCol = new HashMap<String, String[]>();
String stringArray[] = { "1", "2" };
csvCol.put('Marks', stringArray);
String line = "";
BufferedWriter writer = new BufferedWriter(new FileWriter("D:\temp.csv"));
try (BufferedReader br = new BufferedReader(new FileReader("D:\text1.csv"))) {
String headers = "";
String values = "";
String newFileLine ="";
bool isHeader=true;
while ((line = br.readLine()) != null) {
if(isHeader){
csvCol.forEach((k,v) -> {
headers = "," + k ;
});
newFileLine = line + headers ;
}else{
csvCol.forEach((k,v) -> {
values = "," + v ;
});
newFileLine = line + values;
isHeader = false;
}
writer.write(newFileLine);
writer.newLine();
}
}
writer.close();
}
将此作为 text1.csv 中的输入:
Name,Age
Joe,15
Smith,20
I 运行(非常紧密地改编自您的代码):
static void tryWhosebug () {
String line = "";
try {
BufferedWriter writer = new BufferedWriter (new FileWriter ("temp.csv"));
BufferedReader br = new BufferedReader (new FileReader ("text1.csv"));
while ((line = br.readLine ()) != null) {
String newFileLine = line + "," + appendingCol ();
writer.write (newFileLine);
writer.newLine ();
}
writer.close ();
} catch (IOException excep) {
System.err.println ("Exception " + excep);
}
}
public static String appendingCol () {
String stringArray[] = { "Marks", "1", "2" };
StringBuilder sb = new StringBuilder ();
for (int i = 0; i < stringArray.length; i++) {
sb.append (stringArray [i]);
}
String str = sb.toString ();
return str;
}
产生了:
Name,Age,Marks12
Joe,15,Marks12
Smith,20,Marks12
那么似乎很清楚stringArray
应该在另一个方法(你的main方法)中并逐行添加。您的代码还假定行数与该数组中的元素一样多。但是不管那个,我移动了数组并删除了 appendingCol
方法和 运行 这个:
static void tryWhosebug () {
String line = "";
String stringArray[] = { "Marks", "1", "2" };
int lineNum = 0;
try {
BufferedWriter writer = new BufferedWriter (new FileWriter ("temp.csv"));
BufferedReader br = new BufferedReader (new FileReader ("text1.csv"));
while ((line = br.readLine ()) != null) {
String newFileLine = line + "," + stringArray [lineNum++];
writer.write (newFileLine);
writer.newLine ();
}
writer.close ();
} catch (IOException excep) {
System.err.println ("Exception " + excep);
}
}
产生了这个:
Name,Age,Marks
Joe,15,1
Smith,20,2
此问题需要在原始 CSV 中再追加一列。 Java 实现的代码更长。不过用Java下的open-source包SPL写起来很容易,只要一句话:
+
A
1
=file("temp.csv").export@wc(file("test1.csv").import@wc().(~|="Marks,1,2".split@c()(#)))
SPL提供JDBC供JAVA调用,将上述脚本保存为append.splx,将脚本文件作为存储过程调用在JAVA中:
…
Class.forName("com.esproc.jdbc.InternalDriver");
con= DriverManager.getConnection("jdbc:esproc:local://");
st=con.prepareCall("call append()");
st.execute();
…
或者在JAVA中直接执行SQL中的SPL字符串:
…
st = con.prepareStatement("==file(\"temp.csv\").export@wc(file(\"test1.csv\")
.import@wc().(~|=\"Marks,1,2\".split@c()(#)))");
st.execute();
…
我有一个 csv 文件,里面有一些数据,我想在里面追加一列。例如:
Name,Age,Marks
Joe,15,1
Smith,20,2
我想通过代码附加该标记列。我遇到的问题是
Name,Age,Marks
Joe,15
1
2
Smith,20
1
2
数据被写入 2 次,并且在第一列(除了第一列)。我怎样才能阻止它这样做?过去 1 周我一直陷入这个问题
我的代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class appendCol {
public static String appendingCol() {
String stringArray[] = {"Marks", "1", "2"};
StringBuilder sb = new StringBuilder();
for (int i = 0; i < stringArray.length; i++) {
sb.append(stringArray[i]);
}
String str = sb.toString();
return str;
}
public static void main(String[] args) throws IOException {
String line = "";
BufferedWriter writer = new BufferedWriter(new FileWriter("D:\temp.csv"));
try (BufferedReader br = new BufferedReader(new FileReader("D:\text1.csv"))) {
while ((line = br.readLine()) != null) {
String newFileLine = line + "," + appendingCol();
writer.write(newFileLine);
writer.newLine();
}
}
writer.close();
}
}
header 需要与值分开处理。
public static void main(String[] args) throws IOException {
Map<String, String[]> csvCol = new HashMap<String, String[]>();
String stringArray[] = { "1", "2" };
csvCol.put('Marks', stringArray);
String line = "";
BufferedWriter writer = new BufferedWriter(new FileWriter("D:\temp.csv"));
try (BufferedReader br = new BufferedReader(new FileReader("D:\text1.csv"))) {
String headers = "";
String values = "";
String newFileLine ="";
bool isHeader=true;
while ((line = br.readLine()) != null) {
if(isHeader){
csvCol.forEach((k,v) -> {
headers = "," + k ;
});
newFileLine = line + headers ;
}else{
csvCol.forEach((k,v) -> {
values = "," + v ;
});
newFileLine = line + values;
isHeader = false;
}
writer.write(newFileLine);
writer.newLine();
}
}
writer.close();
}
将此作为 text1.csv 中的输入:
Name,Age
Joe,15
Smith,20
I 运行(非常紧密地改编自您的代码):
static void tryWhosebug () {
String line = "";
try {
BufferedWriter writer = new BufferedWriter (new FileWriter ("temp.csv"));
BufferedReader br = new BufferedReader (new FileReader ("text1.csv"));
while ((line = br.readLine ()) != null) {
String newFileLine = line + "," + appendingCol ();
writer.write (newFileLine);
writer.newLine ();
}
writer.close ();
} catch (IOException excep) {
System.err.println ("Exception " + excep);
}
}
public static String appendingCol () {
String stringArray[] = { "Marks", "1", "2" };
StringBuilder sb = new StringBuilder ();
for (int i = 0; i < stringArray.length; i++) {
sb.append (stringArray [i]);
}
String str = sb.toString ();
return str;
}
产生了:
Name,Age,Marks12
Joe,15,Marks12
Smith,20,Marks12
那么似乎很清楚stringArray
应该在另一个方法(你的main方法)中并逐行添加。您的代码还假定行数与该数组中的元素一样多。但是不管那个,我移动了数组并删除了 appendingCol
方法和 运行 这个:
static void tryWhosebug () {
String line = "";
String stringArray[] = { "Marks", "1", "2" };
int lineNum = 0;
try {
BufferedWriter writer = new BufferedWriter (new FileWriter ("temp.csv"));
BufferedReader br = new BufferedReader (new FileReader ("text1.csv"));
while ((line = br.readLine ()) != null) {
String newFileLine = line + "," + stringArray [lineNum++];
writer.write (newFileLine);
writer.newLine ();
}
writer.close ();
} catch (IOException excep) {
System.err.println ("Exception " + excep);
}
}
产生了这个:
Name,Age,Marks
Joe,15,1
Smith,20,2
此问题需要在原始 CSV 中再追加一列。 Java 实现的代码更长。不过用Java下的open-source包SPL写起来很容易,只要一句话:
+ | A |
---|---|
1 | =file("temp.csv").export@wc(file("test1.csv").import@wc().(~|="Marks,1,2".split@c()(#))) |
SPL提供JDBC供JAVA调用,将上述脚本保存为append.splx,将脚本文件作为存储过程调用在JAVA中:
…
Class.forName("com.esproc.jdbc.InternalDriver");
con= DriverManager.getConnection("jdbc:esproc:local://");
st=con.prepareCall("call append()");
st.execute();
…
或者在JAVA中直接执行SQL中的SPL字符串:
…
st = con.prepareStatement("==file(\"temp.csv\").export@wc(file(\"test1.csv\")
.import@wc().(~|=\"Marks,1,2\".split@c()(#)))");
st.execute();
…