【问题标题】:How to convert txt file delimited by pipe symbol to xls file in Java如何将由管道符号分隔的txt文件转换为Java中的xls文件
【发布时间】:2018-04-12 13:24:09
【问题描述】:

我需要将 csv 文件中的数据导入到 selenium 中的 excel 中。

拥有格式如下的 csv 文件:

PERIOD|EMPLID|EMPL_RCD|HOME HOST|NAME|FIRST_NAME|LAST_NAME|FTE|EMPL_STATUS
5/04/2018|78787|0|Home|mandon|steven|jabobs|1|A
6/04/2018|78789|0|Home|stacy|carvin|tans|1|A
11/04/2018|17892|0|Home|neel|harvis|bammer|1|A

需要将这些数据保存在 excel 中,如图所示:

编辑我尝试创建 Excel 文件

我正在使用以下代码从带有管道符号分隔符的 csv 文件生成 (.xls) 文件,如图所示

但在阅读第一行后给出java.lang.NullPointerException

public class DelimitedToXls {
    @SuppressWarnings("deprecation")
    public static void main(String args[]) throws IOException {
        ArrayList<ArrayList<String>> allRowAndColData = null;
        ArrayList<String> oneRowData = null;
        String fName = "C:\\input.csv";
        String currentLine;
        FileInputStream fis = new FileInputStream(fName);
        DataInputStream myInput = new DataInputStream(fis);
        int i = 0;
        allRowAndColData = new ArrayList<ArrayList<String>>();
        while ((currentLine = myInput.readLine()) != null) {
            oneRowData = new ArrayList<String>();
            String oneRowArray[] = currentLine.split(";");
            for (int j = 0; j < oneRowArray.length; j++) {
                oneRowData.add(oneRowArray[j]);
            }
            allRowAndColData.add(oneRowData);
            System.out.println();
            i++;
        }

     try {
         HSSFWorkbook workBook = new HSSFWorkbook();
         HSSFSheet sheet = workBook.createSheet("sheet1");
         for (int i = 0; i < allRowAndColData.size(); i++) {
           ArrayList<?> ardata = (ArrayList<?>) allRowAndColData.get(i);
           HSSFRow row = sheet.createRow((short) 0 + i);
           for (int k = 0; k < ardata.size(); k++) {
                System.out.print(ardata.get(k));
                HSSFCell cell = row.createCell((short) k);
                cell.setCellValue(ardata.get(k).toString());
           }
           System.out.println();
         }
       FileOutputStream fileOutputStream =  new FileOutputStream("C:\\outputFile.xls");
       workBook.write(fileOutputStream);
       fileOutputStream.close();
    } catch (Exception ex) {
   }
 }
}

【问题讨论】:

  • 你只需要用逗号替换管道,然后用excel打开就可以了
  • 这与Selenium 有什么关系?我错过了什么吗?
  • 感谢 Debanjan 的投入。实际上我能够读取 csv 文件,但我需要将这些数据放入具有正确映射的 excel 中,例如第一行应该是标题(PERIOD EMPLID),后续行应该是每列映射的值(2018 年 5 月 4 日 78789 ) 就像图像中显示的那样,这在代码的帮助下,而不是直接在 excel 中打开文本文件。

标签: java excel csv


【解决方案1】:

可以直接用excel打开文件。打开文件->选择文件类型:文本文件。 选择文件,然后在下一个窗口中选择“分隔”选项。下一个窗口选择“其他”并输入 |作为分隔符。 当然,保存为xls。

就是这样。

【讨论】:

  • 实际上我必须借助脚本而不是手动完成。
  • @FabrizioR 我参考了你的答案,希望你没问题。
【解决方案2】:

您有 3 个主要选项:

  • 直接用Excel打开,分隔符设置为|(竖线)
  • 将其重写为有效的 CSV(逗号分隔值)文件(即用逗号替换管道)
  • 将文件内容写入适当的 Excel 文件。

选项 1 - 直接使用 Excel 打开

查看 Fabrizio 的回答。

选项 2 - 将其重写为有效的 CSV 文件

如果您确定文件中没有逗号

您只需将所有出现的| 替换为, 即可获得有效的csv(逗号分隔值)文件。然后就可以用 Excel 打开了。

String fileName = "/path/to/your/file/textFile.txt";
String csvFileName = "/path/to/your/file/csvFile.csv";

try (BufferedReader br = new BufferedReader(new FileReader(fileName));
     Writer writer = new FileWriter(csvFileName)) {
    String line;
    while ((line = br.readLine()) != null) {
        writer.append(line.replaceAll("[|]", ","));
        writer.append("\n");
    }
} catch(Exception e) {
    e.printStackTrace();
}

此代码将您的文件内容更改为

PERIOD,EMPLID,EMPL_RCD,HOME HOST,NAME,FIRST_NAME,LAST_NAME,FTE,EMPL_STATUS
5/04/2018,78787,0,Home,mandon,steven,jabobs,1,A
6/04/2018,78789,0,Home,stacy,carvin,tans,1,A
11/04/2018,17892,0,Home,neel,harvis,bammer,1,A

如果您的文件中可能包含逗号

您需要逐个标记读取标记,并用双引号将包含逗号的标记括起来。然后用逗号替换所有管道。例如,这一行

5/04/2018|78787|0|Home, Work|mandon|steven|jabobs|1|A

将被转换为

5/04/2018,78787,0,"Home, Work",mandon,steven,jabobs,1,A

你可以这样做:

String fileName = "/path/to/your/file/textFile.txt";
String csvFileName = "/path/to/your/file/csvFile.csv";

try (BufferedReader br = new BufferedReader(new FileReader(fileName));
     Writer writer = new FileWriter(csvFileName)) {
    String line;
    while ((line = br.readLine()) != null) {
        String csvLine = Arrays.stream(line.split("[|]")) // split on pipes
            .map(token -> token.contains(",") ? "\""+token+"\"" : token) // surround with double quotes if there is a comma in the value
            .collect(Collectors.joining(",", "", "\n")); // join with commas
        writer.append(csvLine);
    }
} catch(Exception e) {
    e.printStackTrace();
}

选项 3 - 写入 Excel 文件

您还可以使用 Apache POI 库创建正确的 Excel 文件 .xls.xlsx。这是一个使用 POI-OOXML 3.17 的示例(截至今天的最新版本)You can get it from Maven Repository

String fileName = "/path/to/your/file/textFile.txt";
String excelFileName = "/path/to/your/file/excelFile.xlsx";

// Create a Workbook and a sheet in it
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Sheet1");

// Read your input file and make cells into the workbook
try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
    String line;
    Row row;
    Cell cell;
    int rowIndex = 0;
    while ((line = br.readLine()) != null) {
        row = sheet.createRow(rowIndex);
        String[] tokens = line.split("[|]");
        for(int iToken = 0; iToken < tokens.length; iToken++) {
            cell = row.createCell(iToken);
            cell.setCellValue(tokens[iToken]);
        }
        rowIndex++;
    }
} catch(Exception e) {
    e.printStackTrace();
}

// Write your xlsx file
try (FileOutputStream outputStream = new FileOutputStream(excelFileName)) {
    workbook.write(outputStream);
    workbook.close();
} catch (IOException e) {
    e.printStackTrace();
}

【讨论】:

  • 感谢 Bentaye 的意见。转换后如何借助上图所示的代码在excel中获取它
  • 不明白你的问题,用逗号隔开后,直接用excel打开即可。或者您想生成正确的 Excel 文件 (.xls)?如果是这样,您需要使用诸如POI 之类的库。我可以为此添加一些代码。
  • @Ishant 当然,我会在今天几个小时后到达工作地点时补充这一点。这也是一小段代码。
  • 非常感谢。
  • @Ishant 我用 Excel 版本更新了我的答案。请看一下
【解决方案3】:

您可以将| 替换为字符\t 并将其存储在.csv 文件中。 我在将 CSV 转换为 XLS 时做了类似的事情:

try{
            FileReader fr=new FileReader("TEJAS.CSV");
            FileWriter fw=new FileWriter("TEJASEXEL.xls");
            while((c=fr.read())!=-1){
                if(c==','){
                    c='\t';
                }
                fw.write(c);
            }
            fr.close();
            fw.close();

        }

【讨论】:

    猜你喜欢
    • 2014-10-15
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2017-01-11
    相关资源
    最近更新 更多