簡體   English   中英

CSV 文件未正確寫入 Java

[英]CSV file not writing properly in Java

我在編寫 CSV 文件時遇到了一些問題。 我制作的程序使用HTML praser從網站獲取數據。 然后將該數據保存到 .csv 文件中。

我遇到的問題是,它不會將所有數據寫入文件(而是截斷其中的一些),並且當有多個 url 時,它根本不會寫入它們!

要使用該程序,首先輸入一個目錄,然后在頂部區域,輸入這些 url。

http://www.freddiemac.com/debt/data/cgi-bin/cusipdetail.cgi?cusip=04541GEL2
http://www.freddiemac.com/debt/data/cgi-bin/cusipdetail.cgi?cusip=31359T8L5
http://www.freddiemac.com/debt/data/cgi-bin/cusipdetail.cgi?cusip=31395RGT9
http://www.freddiemac.com/debt/data/cgi-bin/cusipdetail.cgi?cusip=57643LJU1
http://www.freddiemac.com/debt/data/cgi-bin/cusipdetail.cgi?cusip=31358RRC9
http://www.freddiemac.com/debt/data/cgi-bin/cusipdetail.cgi?cusip=31392V6H0

按發送信息並按開始。 它應該在底部框中記錄所有內容。

這是程序的代碼:

package com.js.extract;

import java.io.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import org.htmlparser.beans.StringBean;
import org.htmlparser.util.ParserException;

public class Extraction_GUI extends JFrame {

/**
 * 
 */
private static final long serialVersionUID = 1L;

protected JButton start;
protected JButton sendInfo;

protected JTextArea infoArea;
protected static JTextArea log;

protected JScrollPane sp;
protected JScrollPane sp2;

protected JSplitPane pane;

protected JPanel mainPanel;
protected JPanel aPanel;
protected JPanel lPanel;
protected int areaStatus = 0;

static protected Calendar cal = Calendar.getInstance();

protected static ArrayList<String> urls = new ArrayList<String>();

public Extraction_GUI(){
    super("Extraction by Jeel Shah");
    setSize(660,520);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setResizable(false);

    mainPanel = new JPanel();
    mainPanel.setLayout(new FlowLayout());

    aPanel = new JPanel();
    aPanel.setLayout(new FlowLayout());

    lPanel = new JPanel();
    lPanel.setLayout(new FlowLayout());

    start = new JButton("start");
    sendInfo = new JButton("send info");
    infoArea = new JTextArea("http://www.freddiemac.com/debt/data/cgi-bin/cusipdetail.cgi?cusip=3133F0GM5"
            ,13,55);

    log = new JTextArea(10,55);
    log.setEditable(false);

    sp = new JScrollPane(infoArea);
    sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    sp2 = new JScrollPane(log);
    sp2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    sp2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    aPanel.add(sp);
    lPanel.add(sp2);

    pane = new JSplitPane(JSplitPane.VERTICAL_SPLIT,aPanel,lPanel);

    mainPanel.add(pane);
    mainPanel.add(start);
    mainPanel.add(sendInfo);

    add(mainPanel);

    setVisible(true);
    final String toSave = JOptionPane.showInputDialog(null, "Please enter where you would like to save your files: ");
    log.append("Data will be saved to: "+toSave+"\n");

    sendInfo.addActionListener(new infoListener());
    start.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            try {
                start(toSave);
            } catch (ParserException e1) {
                e1.printStackTrace();
            } catch (IOException e2) {
                e2.printStackTrace();
            }
        }
    });
}

// start
public static void start(String file) throws ParserException, IOException {

    for(int i = 0; i < urls.size();i++) {
        BufferedWriter writer = new BufferedWriter(new FileWriter(file+"CUSIP"+i+".csv"));
        StringBean sb = new StringBean ();
        sb.setLinks(false);
        sb.setReplaceNonBreakingSpaces(true);

        sb.setCollapse(true);
        sb.setURL (urls.get(i)); 
        String toReduce = sb.getStrings ();

        StringBuffer buffer = new StringBuffer(toReduce);

        if(toReduce.contains("*CUSIP Detail information will be available when this issue settles.")) {
            log.append("CUSIP Detail not available.For "+urls.get(i)+"\n");
        }else {
            buffer.delete(0, toReduce.indexOf("Cusip/ISIN")-1);
            buffer.delete(buffer.indexOf("Underwriters:"), buffer.length());

            String[] data = new String[13];

            data[0] = buffer.substring(0, buffer.indexOf("Instrument Type:"));
            data[1] = buffer.substring(buffer.indexOf("Instrument Type:"),buffer.indexOf("Call Type:"));
            data[2] = buffer.substring(buffer.indexOf("Call Type:"),buffer.indexOf("Issue Date:"));
            data[3] = buffer.substring(buffer.indexOf("Issue Date:"),buffer.indexOf("Issue Price:"));
            data[4] = buffer.substring(buffer.indexOf("Issue Price:"),buffer.indexOf("Amount Issued:"));
            data[5] = buffer.substring(buffer.indexOf("Amount Issued:"),buffer.indexOf("Lockout Period:"));
            data[6] = buffer.substring(buffer.indexOf("Lockout Period:"),buffer.indexOf("Currency"));
            data[7] = buffer.substring(buffer.indexOf("Currency"),buffer.indexOf("Denomination:"));
            data[8] = buffer.substring(buffer.indexOf("Denomination:"),buffer.indexOf("First Payment"));
            data[9] = buffer.substring(buffer.indexOf("First Payment"),buffer.indexOf("Maturity Date"));
            data[10] = buffer.substring(buffer.indexOf("Maturity Date"),buffer.indexOf("Original Coupon:"));
            data[11] = buffer.substring(buffer.indexOf("Original Coupon:"),buffer.indexOf("Current Coupon:"));
            data[12] = buffer.substring(buffer.indexOf("Current Coupon:"),buffer.length());

            for(String s : data) {
                writer.write(s);
                writer.write(",");
                writer.newLine();
            }
        }
        writer.flush();
        writer.close();
        log.append("Harvested: "+urls.get(i)+" successfully"+" \n");

    }
    log.append("Completed at: "+cal.get(Calendar.HOUR)+":"+cal.get(Calendar.MINUTE)+":"+cal.get(Calendar.SECOND) + "\n");
}

class infoListener implements ActionListener{

    public void actionPerformed(ActionEvent arg0) {
            String url = infoArea.getText();

            StringTokenizer st = new StringTokenizer(url,",");

            while(st.hasMoreTokens()) {
                urls.add(st.nextToken());
            }
            log.append("Data Recieved at: "+cal.get(Calendar.HOUR)+":"+cal.get(Calendar.MINUTE)+":"+cal.get(Calendar.SECOND)+"\n");
    }

}

public static void main(String[]args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new Extraction_GUI();
        }
    });
}

}

注意:您需要下載 HTML Parser 並將其添加到您的構建路徑中。

第一的:

您應該在以下代碼行中的“CUSIP”之前添加“/”:

BufferedWriter writer = new BufferedWriter(new FileWriter(file + "CUSIP" + i + ".csv"));

它應該是

BufferedWriter writer = new BufferedWriter(new FileWriter(file + "/CUSIP" + i + ".csv"));

否則,您的程序將找不到 output 文件。

第二:

您應該傳遞 url,以“,”分隔。 否則您的程序無法正確解析輸入。

所以輸入應該是:

http://www.freddiemac.com/debt/data/cgi-bin/cusipdetail.cgi?cusip=04541GEL2,
http://www.freddiemac.com/debt/data/cgi-bin/cusipdetail.cgi?cusip=31359T8L5,
http://www.freddiemac.com/debt/data/cgi-bin/cusipdetail.cgi?cusip=31395RGT9,
http://www.freddiemac.com/debt/data/cgi-bin/cusipdetail.cgi?cusip=57643LJU1,
http://www.freddiemac.com/debt/data/cgi-bin/cusipdetail.cgi?cusip=31358RRC9,
http://www.freddiemac.com/debt/data/cgi-bin/cusipdetail.cgi?cusip=31392V6H0

第三:

具有您為輸入指定的 URL 的頁面僅包含以下文本:

CUSIP: 31392V6H0*
*CUSIP Detail information will be available when this issue settles.

在這種情況下,您的程序不應將任何內容寫入文件。

請參閱程序的以下部分:

    if (toReduce.contains("*CUSIP Detail information will be available when this issue settles.")) {
        log.append("CUSIP Detail not available.For " + urls.get(i) + "\n");
    } else {
        buffer.delete(0, toReduce.indexOf("Cusip/ISIN"));
        buffer.delete(buffer.indexOf("Underwriters:"), buffer.length());

        String[] data = new String[13];

        data[0] = buffer.substring(0, buffer.indexOf("Instrument Type:"));
        data[1] = buffer.substring(buffer.indexOf("Instrument Type:"), buffer.indexOf("Call Type:"));
        data[2] = buffer.substring(buffer.indexOf("Call Type:"), buffer.indexOf("Issue Date:"));
        data[3] = buffer.substring(buffer.indexOf("Issue Date:"), buffer.indexOf("Issue Price:"));
        data[4] = buffer.substring(buffer.indexOf("Issue Price:"), buffer.indexOf("Amount Issued:"));
        data[5] = buffer.substring(buffer.indexOf("Amount Issued:"), buffer.indexOf("Lockout Period:"));
        data[6] = buffer.substring(buffer.indexOf("Lockout Period:"), buffer.indexOf("Currency"));
        data[7] = buffer.substring(buffer.indexOf("Currency"), buffer.indexOf("Denomination:"));
        data[8] = buffer.substring(buffer.indexOf("Denomination:"), buffer.indexOf("First Payment"));
        data[9] = buffer.substring(buffer.indexOf("First Payment"), buffer.indexOf("Maturity Date"));
        data[10] = buffer.substring(buffer.indexOf("Maturity Date"), buffer.indexOf("Original Coupon:"));
        data[11] = buffer.substring(buffer.indexOf("Original Coupon:"), buffer.indexOf("Current Coupon:"));
        data[12] = buffer.substring(buffer.indexOf("Current Coupon:"), buffer.length());

        for (String s : data) {
            writer.write(s);
            writer.write(",");
            writer.newLine();
        }
    }

向前:

我已經使用默認 url 啟動了您的程序:

http://www.freddiemac.com/debt/data/cgi-bin/cusipdetail.cgi?cusip=3133F0GM5

它將所有數據寫入文件CUSIP0.csv

這是 output:

Cusip/ISIN:
3133F0GM5
US3133F0GM57
,
Instrument Type:
Freddie Notes
,
Call Type:
American
,
Issue Date:
10/18/2001
,
Issue Price:
100.0
,
Amount Issued:
$20,809,000
,
Lockout Period:
2 Year(s)
,
Currency:
USD
,
Denomination:
$1,000
,
First Payment:
11/15/2001
,
Maturity Date:
10/15/2011
,
Original Coupon:
5.250%
,
Current Coupon:
5.250%
,

唯一被截斷的部分如下:

Underwriters:   LASALLE FINANCIAL SERVICES, INC.

這是因為,您忘記了解析它。

結論:

以下代碼有效,但您可能想要將更多數據寫入 output 文件。 您應該考慮如何正確刪除結尾。

package com.js.extract;

import java.io.*;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import org.htmlparser.beans.StringBean;
import org.htmlparser.util.ParserException;

public class Extraction_GUI extends JFrame {

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    protected JButton start;
    protected JButton sendInfo;
    protected JTextArea infoArea;
    protected static JTextArea log;
    protected JScrollPane sp;
    protected JScrollPane sp2;
    protected JSplitPane pane;
    protected JPanel mainPanel;
    protected JPanel aPanel;
    protected JPanel lPanel;
    protected int areaStatus = 0;
    static protected Calendar cal = Calendar.getInstance();
    protected static ArrayList<String> urls = new ArrayList<String>();

    public Extraction_GUI() {
        super("Extraction by Jeel Shah");
        setSize(660, 520);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);

        mainPanel = new JPanel();
        mainPanel.setLayout(new FlowLayout());

        aPanel = new JPanel();
        aPanel.setLayout(new FlowLayout());

        lPanel = new JPanel();
        lPanel.setLayout(new FlowLayout());

        start = new JButton("start");
        sendInfo = new JButton("send info");
        infoArea = new JTextArea("http://www.freddiemac.com/debt/data/cgi-bin/cusipdetail.cgi?cusip=3133F0GM5", 13, 55);

        log = new JTextArea(10, 55);
        log.setEditable(false);

        sp = new JScrollPane(infoArea);
        sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        sp2 = new JScrollPane(log);
        sp2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        sp2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        aPanel.add(sp);
        lPanel.add(sp2);

        pane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, aPanel, lPanel);

        mainPanel.add(pane);
        mainPanel.add(start);
        mainPanel.add(sendInfo);

        add(mainPanel);

        setVisible(true);
        final String toSave = JOptionPane.showInputDialog(null, "Please enter where you would like to save your files: ");
        log.append("Data will be saved to: " + toSave + "\n");

        sendInfo.addActionListener(new infoListener());
        start.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                try {
                    start(toSave);
                } catch (ParserException e1) {
                    e1.printStackTrace();
                } catch (IOException e2) {
                    e2.printStackTrace();
                }
            }
        });
    }

// start
    public static void start(String file) throws ParserException, IOException {

        for (int i = 0; i < urls.size(); i++) {
            // First mistake was in the following line.
            BufferedWriter writer = new BufferedWriter(new FileWriter(file + "/CUSIP" + i + ".csv"));
            StringBean sb = new StringBean();
            sb.setLinks(false);
            sb.setReplaceNonBreakingSpaces(true);

            sb.setCollapse(true);
            sb.setURL(urls.get(i));
            String toReduce = sb.getStrings();

            System.out.println("toReduce = \n" + toReduce);

            StringBuffer buffer = new StringBuffer(toReduce);

        if (toReduce.contains("*CUSIP Detail information will be available when this issue settles.")) {
            log.append("CUSIP Detail not available.For " + urls.get(i) + "\n");
        } else {
            buffer.delete(0, toReduce.indexOf("Cusip/ISIN")-1);
            // The following line removes info about Underwriters from parsing. So, I commented it.
            //buffer.delete(buffer.indexOf("Underwriters:"), buffer.length());

            String[] data = new String[14];

            data[0] = buffer.substring(0, buffer.indexOf("Instrument Type:"));
            data[1] = buffer.substring(buffer.indexOf("Instrument Type:"), buffer.indexOf("Call Type:"));
            data[2] = buffer.substring(buffer.indexOf("Call Type:"), buffer.indexOf("Issue Date:"));
            data[3] = buffer.substring(buffer.indexOf("Issue Date:"), buffer.indexOf("Issue Price:"));
            data[4] = buffer.substring(buffer.indexOf("Issue Price:"), buffer.indexOf("Amount Issued:"));
            data[5] = buffer.substring(buffer.indexOf("Amount Issued:"), buffer.indexOf("Lockout Period:"));
            data[6] = buffer.substring(buffer.indexOf("Lockout Period:"), buffer.indexOf("Currency"));
            data[7] = buffer.substring(buffer.indexOf("Currency"), buffer.indexOf("Denomination:"));
            data[8] = buffer.substring(buffer.indexOf("Denomination:"), buffer.indexOf("First Payment"));
            data[9] = buffer.substring(buffer.indexOf("First Payment"), buffer.indexOf("Maturity Date"));
            data[10] = buffer.substring(buffer.indexOf("Maturity Date"), buffer.indexOf("Original Coupon:"));
            data[11] = buffer.substring(buffer.indexOf("Original Coupon:"), buffer.indexOf("Current Coupon:"));
            // Some changes are made in that line:
            data[12] = buffer.substring(buffer.indexOf("Current Coupon:"), buffer.indexOf("Underwriters:"));
            // This line is added.
            data[13] = buffer.substring(buffer.indexOf("Underwriters:"), buffer.length());

            for (String s : data) {
                writer.write(s);
                writer.write(",");
                writer.newLine();
            }
        }
            writer.flush();
            writer.close();
            log.append("Harvested: " + urls.get(i) + " successfully" + " \n");

        }
        log.append("Completed at: " + cal.get(Calendar.HOUR) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND) + "\n");
    }

    class infoListener implements ActionListener {

        public void actionPerformed(ActionEvent arg0) {
            String url = infoArea.getText();

            StringTokenizer st = new StringTokenizer(url, ",");

            while (st.hasMoreTokens()) {
                urls.add(st.nextToken());
            }
            log.append("Data Recieved at: " + cal.get(Calendar.HOUR) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND) + "\n");
        }
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            public void run() {
                new Extraction_GUI();
            }
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM