如何从 Java 中的 csv 文件中删除包含空白单元格的行
How to remove row which contains blank cell from csv file in Java
我正在尝试对数据集进行数据清理。通过数据清理,我的意思是删除包含 NaN
或重复值或空单元格的行。这是我的代码
数据集如下所示:
Sno Country noofDeaths
1 32432
2 Pakistan NaN
3 USA 3332
3 USA 3332
excel 文件图片:
public class data_reader {
String filePath="src\abc.csv";
public void readData() {
BufferedReader br = null;
String line = "";
HashSet<String> lines = new HashSet<>();
try {
br = new BufferedReader(new FileReader(filePath));
while ((line = br.readLine()) != null) {
if(!line.contains("NaN") || !line.contains("")) {
if (lines.add(line)) {
System.out.println(line);
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
它适用于 NaN 值和重复行但不适用于空单元格,请帮助如何做到这一点。
!line.contains("")
这不起作用。
条件 !line.contains("") - 没有意义,因为每个字符串都包含空字符串。
一般建议:
- 不要硬编码file-path,代码必须可重用;
- 尝试使用资源;
- camel-case 个名字。
public class DataReader {
public static void main(String[] args) {
new DataReader().readData("src\abc.csv");
}
public void readData(String filePath) {
try(BufferedReader br = new BufferedReader(new FileReader(filePath))) {
HashSet<String> lines = new HashSet<>();
String line = null;
while ((line = br.readLine()) != null) {
if(!line.contains("NaN")) {
for (String cell: line.split(",")) {
if (!cell.isBlank()&&lines.add(cell)) {
System.out.print(cell + " ");
}
}
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在我看来,这是一个很容易解决的问题。给定一个包含空行的 CSV 文件
foo,bar,baz
1,One,123
,,
2,Two,456
3,Three,789
您可以阅读这些行并将空行定义为包含以逗号分隔的空字符串的行。您可以读取文件的内容,将填充的行存储到字符串缓冲区中,然后在提取空行后保存缓冲区的内容。下面的代码实现了这一点:
public static void main(String[] args) throws IOException {
String file ="test.csv";
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
StringBuilder sbuff = new StringBuilder();
while ((line = reader.readLine()) != null) {
String[] tokens = line.split(",");
if (containsText(tokens)) {
sbuff.append(line + "\n");
}
}
reader.close();
System.out.println(sbuff.toString());
// save file here
}
public static boolean containsText(String[] tokens) {
for (String token: tokens) {
if (token.length() > 0)
return true;
}
return false;
}
经过运行代码后,输出为:
foo,bar,baz
1,One,123
2,Two,456
3,Three,789
同样的代码可用于通过简单的方法确定单元格是否为空:
public static boolean isCellEmpty(String[] tokens) {
for (String token: tokens) {
if (token.isBlank())
return true;
}
return false;
}
我正在尝试对数据集进行数据清理。通过数据清理,我的意思是删除包含 NaN
或重复值或空单元格的行。这是我的代码
数据集如下所示:
Sno Country noofDeaths
1 32432
2 Pakistan NaN
3 USA 3332
3 USA 3332
excel 文件图片:
public class data_reader {
String filePath="src\abc.csv";
public void readData() {
BufferedReader br = null;
String line = "";
HashSet<String> lines = new HashSet<>();
try {
br = new BufferedReader(new FileReader(filePath));
while ((line = br.readLine()) != null) {
if(!line.contains("NaN") || !line.contains("")) {
if (lines.add(line)) {
System.out.println(line);
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
它适用于 NaN 值和重复行但不适用于空单元格,请帮助如何做到这一点。
!line.contains("")
这不起作用。
条件 !line.contains("") - 没有意义,因为每个字符串都包含空字符串。
一般建议:
- 不要硬编码file-path,代码必须可重用;
- 尝试使用资源;
- camel-case 个名字。
public class DataReader {
public static void main(String[] args) {
new DataReader().readData("src\abc.csv");
}
public void readData(String filePath) {
try(BufferedReader br = new BufferedReader(new FileReader(filePath))) {
HashSet<String> lines = new HashSet<>();
String line = null;
while ((line = br.readLine()) != null) {
if(!line.contains("NaN")) {
for (String cell: line.split(",")) {
if (!cell.isBlank()&&lines.add(cell)) {
System.out.print(cell + " ");
}
}
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
在我看来,这是一个很容易解决的问题。给定一个包含空行的 CSV 文件
foo,bar,baz
1,One,123
,,
2,Two,456
3,Three,789
您可以阅读这些行并将空行定义为包含以逗号分隔的空字符串的行。您可以读取文件的内容,将填充的行存储到字符串缓冲区中,然后在提取空行后保存缓冲区的内容。下面的代码实现了这一点:
public static void main(String[] args) throws IOException {
String file ="test.csv";
BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
StringBuilder sbuff = new StringBuilder();
while ((line = reader.readLine()) != null) {
String[] tokens = line.split(",");
if (containsText(tokens)) {
sbuff.append(line + "\n");
}
}
reader.close();
System.out.println(sbuff.toString());
// save file here
}
public static boolean containsText(String[] tokens) {
for (String token: tokens) {
if (token.length() > 0)
return true;
}
return false;
}
经过运行代码后,输出为:
foo,bar,baz
1,One,123
2,Two,456
3,Three,789
同样的代码可用于通过简单的方法确定单元格是否为空:
public static boolean isCellEmpty(String[] tokens) {
for (String token: tokens) {
if (token.isBlank())
return true;
}
return false;
}