读取csv文件指定的某一行或者多行,获取指定行的指定元素

package service;

import jar.org.apache.commons.lang.StringUtils;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.util.ArrayList;
import java.util.List;

/**
* 读取csv文件指定的某一行或者多行,会先转化为整体数组,再将整体数组分割重新定义元素数组,可以获取指定行的指定元素
*
* 指定行的指定元素 需要自己读取 String[] array.get(1);
 * @author zhangkuan
* @version Id: ReadCsvAppointLineConvertArrayTest.java, v 0.1 2022/5/10 15:00 PM zhangkuan Exp $$
*/
public class ReadCsvAppointLineConvertArrayTest {

/**
* main方法测试,调用arrayListConvertArray方法传入入参文件路径、指定行
*
* @return String[] 按行读出来的数组
*/
public static void main(String[] args) {
ReadCsvAppointLineConvertArrayTest test = new ReadCsvAppointLineConvertArrayTest();
int[] a = {2};
//得到的数组是一个整体,数组长度为1
String[] s = test.arrayListConvertArray("D:\\111.csv", a);
// System.out.println(s[0]);
// System.out.println(s.length);//数组长度为1
//将转换出来的一个整体数组,拆分成字符串
String str= StringUtils.join(s,",");
// System.out.println(str);
//再将字符串赋值转换为新的数组,数组长度为字符个数
String[] array = str.split(",");

//其他场景:(末尾加注释)给csv文件每行的最后面 加上/注释内容 需要先进行分割最后一个元素,在重新放入数组里面
// String str1 = array[array.length-1];
// System.out.println(str1);
// String[] str2= StringUtils.split(str1,"/");
// array[array.length-1] = str2[0];

//再获取数组对应的元素
// System.out.println(array.length);//元素数组长度为真实的字符个数
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[array.length-1]);
}

/**
* 转换List<List<String>>为 String[]类型
*
* @param filePath csv文件路径
* @param lineArray 指定行
* @return String[] 按行读出来的数组
*/
public String[] arrayListConvertArray (String filePath, int[] lineArray) {
List<String> stringList = readAppointedLineNumberArray(filePath, lineArray);
String[] s = stringList.toArray(new String[stringList.size()]);
return s;
}

/**
* 读取文件指定行数(读取多行)
* @param filePath csv文件路径
* @param lineArray 指定行
*/
public static List<String> readAppointedLineNumberArray(String filePath, int[] lineArray){
FileReader in = null;
LineNumberReader reader = null;
List<String> resultStr = new ArrayList<String>();
//对数组按从小到大排序
lineArray = sortArray(lineArray);
if(lineArray.length == 0){
return new ArrayList<String>();
}
try {
in = new FileReader(filePath);
reader = new LineNumberReader(in);
int lineNumber = lineArray.length;
int line = 1;
int i = 0;
String s = "";
while((s = reader.readLine()) != null){
if(i < lineNumber && line ==lineArray[i]){
i++;
// System.out.println(s);
resultStr.add(s);
}
line++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
closeResource(in, reader);
}
return resultStr;
}

/**
* 关闭资源
* @param in 文件读入流
* @param reader 按行读入流
*/
public static void closeResource(FileReader in,LineNumberReader reader){
try {
if(reader != null){
reader.close();
}
if(in != null){
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 冒泡排序
* @param array 数组
* @return int[] 指定行数组
*/
public static int[] sortArray(int[] array){
if(array.length == 0){
return array;
}
for(int i = 0; i < array.length; i++){
for(int j = 0; j < array.length-i-1; j++){
if(array[j+1] < array[j]){
int temp = array[j+1];
array[j + 1] = array[j];
array[j] = temp;
}
}
}
return array;
}
}
posted @ 2022-08-22 14:18  夜尽天明之无关风月  阅读(1024)  评论(0)    收藏  举报