我有一个要求:
我的输入将是一个csv文件,我将获得如下值:
f:
.LFB0:
.cfi_startproc
pushq %rbp ; save the pointer to the caller's frame
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp ; new frame starts from %rsp (current stack ptr)
; starting from this place look how %rbp is used
; the maximum offset is what you're looking for
.cfi_def_cfa_register 6
movl %edi, -20(%rbp)
movl %esi, -24(%rbp)
movl -20(%rbp), %edx
movl -24(%rbp), %eax
addl %edx, %eax
movl %eax, -8(%rbp)
movl -8(%rbp), %eax
subl $2, %eax
movl %eax, -4(%rbp)
movl -4(%rbp), %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
我必须根据标题阅读此csv文件。比如说:如果action = 1且email是null,那么我必须从action更改为2或者将email更改为null或类似的东西。
我不知道如何根据标题读取和解析值。这是我尝试的代码:
action, userId, firstName, email, lastName
1,2,sample,abc@gmail.com,test
2,3,justtest,def@gmail.com,test
这只是打印新行中的所有值,如下所示:
String csvFile = "C:\\Test.csv";
// create BufferedReader to read csv file
BufferedReader br;
String line = "";
br = new BufferedReader(new FileReader(csvFile));
br.readLine();
// Read the file line by line starting from the second line
while ((line = br.readLine()) != null) {
// Get all tokens available in line
String[] tokens = line.split(",");
if (tokens.length > 0) {
for (int i = 0; i < tokens.length; i++) {
System.out.println("All Rows ------->" + tokens[i]);
}
}
}
请帮我填写此代码。提前谢谢。
答案 0 :(得分:2)
为了将CSV文件解析为可后处理的格式,我首先创建一个枚举,按正确的顺序对文件的列进行建模:
enum Column {
ACTION, USERID, FIRSTNAME, EMAIL, LASTNAME;
public static final Column[] VALUES = values();
}
然后,我会将文件读入列到列值列表的映射中(此数据结构也称为&#34; multimap&#34;):
Map<Column, List<String>> columns =
new LinkedHashMap<>();
// initialize the map
for (Column c : Column.VALUES) {
columns.put(c, new ArrayList<>());
}
String csvFile = "C:\\Test.csv";
String line = "";
// create BufferedReader to read csv file
BufferedReader br = new BufferedReader(new FileReader(csvFile));
br.readLine();
// Read the file line by line starting from the second line
while ((line = br.readLine()) != null) {
// Get all tokens available in line
String[] tokens = line.split(",");
if (tokens.length > 0) {
for (int i = 0; i < tokens.length; i++) {
columns.get(Column.VALUES[i]).add(tokens[i].trim());
}
}
}
现在您已订购数据,您可以根据业务规则开始对值进行后处理。当然,您也可以在读取文件时应用规则,但这可能会损害代码的可读性。访问文件中的单个单元格很容易;例如可以使用columns.get(Column.EMAIL).get(1)
检索第二行的电子邮件地址。
正在运行
System.out.println(columns);
使用您的示例文件输出:
{ACTION=[1, 2], USERID=[2, 3], FIRSTNAME=[sample, justtest], EMAIL=[abc@gmail.com, def@gmail.com], LASTNAME=[test, test]}
答案 1 :(得分:2)
使用Apache Common CSV库(或任何其他合适的库)读取CSV文件,然后在程序中应用业务逻辑。
https://commons.apache.org/proper/commons-csv/
它将以CSVRecord的形式为您提供行列表,然后您只需要通过迭代列表来应用基于值的业务逻辑。列表中的第一个元素将是您的标题。
Reader in = new FileReader("File Name");
CSVParser parser = new CSVParser(in, CSVFormat.EXCEL);
List<CSVRecord> csvRecords = parser.getRecords();