【问题标题】:Data not showing in the oracle Sql Database importing from .CSV从 .CSV 导入的 Oracle Sql 数据库中未显示数据
【发布时间】:2016-04-21 17:13:20
【问题描述】:

我抓取了一个网站并将数据提取到 .CSV 文件中。此过程已成功执行并正常运行。但是,当我尝试获取 Oracle Sql 数据库表中的数据时,它只带来了 .CSV 文件的第一行,并且不检索数据的其他行。我正在尝试通过在创建脚本中编写的SQLLoader 检索 CSV 文件的数据。当我通过该脚本调用任何其他 CSV 时,它工作正常并带来了所有数据。但是,这个问题只出现在通过java程序创建的文件中。
Java代码如下。

public static void parsingHTML() throws Exception {
  for (int i = 1; i <= 1; i++) {

    tbodyElements = doc.getElementsByTag("tbody");

    if (tbodyElements.isEmpty()) {
        throw new Exception("Table is not found");
    }
    elements = tbodyElements.get(0).getElementsByTag("tr");

    for (Element trElement : elements) {
        trElement2 = trElement.getElementsByTag("tr");
        tdElements = trElement.getElementsByTag("td");
        File fold = new File("C:\\convertedCSV9.csv");
        fold.delete();
        File fnew = new File("C:\\convertedCSV9.csv");
        FileWriter sb = new FileWriter(fnew, true);

        for (Iterator<Element> it = tdElements.iterator(); it.hasNext();) {

            Element tdElement1 = it.next();
            final String content2 = tdElement1.text();
            if (it.hasNext()) {
                sb.append("\n");

            }
            for (Iterator<Element> it2 = trElement2.iterator(); it.hasNext();) {
                Element tdElement2 = it.next();
                final String content = tdElement2.text();

                if (it2.hasNext()) {

                    sb.append(formatData(content));
                    sb.append("   ,   ");

                }
                if (!it.hasNext()) {
                    String content1 = content.replaceAll(",$", " ");
                    sb.append(formatData(content1));
                    it2.next();

                }

            }

            System.out.println(sb.toString());
            sb.flush();
            sb.close();

        }
        System.out.println(sampleList.add(tdElements));

    }
  }
}

而创建脚本是

-- Create table
create table TEST_EXCEL_OPEN_END_SMRY
(
  fund_name     VARCHAR2(150),
  rating        VARCHAR2(50),
  validity_date VARCHAR2(50),
  fund_nav      VARCHAR2(50),
  ytd           VARCHAR2(50),
  mtd           VARCHAR2(50),
  day_1         VARCHAR2(50),
  days_15       VARCHAR2(50),
  days_30       VARCHAR2(50),
  days_90       VARCHAR2(50),
  days_180      VARCHAR2(50),
  days_270      VARCHAR2(50),
  days_365      VARCHAR2(50)
)
organization external
(
  type ORACLE_LOADER
  default directory DIR_KSE
  access parameters 
  (
    RECORDS DELIMITED BY NEWLINE
        badfile bad_dir:'revext%a_%p.bad'
        logfile log_dir:'revext%a_%p.log'
        FIELDS TERMINATED BY ','
        MISSING FIELD VALUES ARE NULL
        (
    FUND_NAME,
    RATING ,
    VALIDITY_DATE ,
    FUND_NAV ,
    YTD ,
    MTD ,
    DAY_1 ,
    DAYS_15 ,
    DAYS_30 ,
    DAYS_90 ,
    DAYS_180,
    DAYS_270,
    DAYS_365
        )
  )
  location (DIR_KSE:'convertedCSV9.csv')
)
reject limit UNLIMITED;

P.S:DIR_KSE 的路径是正确的。我还附上了 CSV 和数据库结果的快照。

【问题讨论】:

  • 你检查输入文件了吗?可能存在检测行尾的问题,使您的文件成为单行。
  • 我附上了.csv文件快照,你可以看到,显然没有检测到问题。
  • 日志文件说什么? Excel 是否允许您将该文本转换为数据(因为您的屏幕截图包含单元格 A 中的所有内容)?
  • @AlexPoole Sir 实际上这是一个 .CSV 文件(逗号分隔值文件)。据我所知,我们不能将excel的数据直接导入oracle sql数据库。为此,我们必须将其转换为 .CSV 文件。因此,我将数据直接抓取到 CSV 文件中,这样我就可以跳过那个 excel 文件。
  • 是的,我知道它是 CSV,但您已在 Excel 中打开它以创建屏幕截图。我想知道逗号是否是其他字符,以及数据功能区中的 dong 'Text to columns' 是否会抱怨。不过,告诉我们外部表日志文件的内容会更有用。

标签: java oracle csv web-scraping sql-loader


【解决方案1】:

您的 Java 代码使用换行符 (LF) 作为行分隔符:

            sb.append("\n");

这在 Linux/UNIX 世界中很好,但您的 Oracle 实例似乎在 Windows 上运行,并且默认情况下需要 Windows 样式的行分隔符,包括回车和换行 (CRLF)。

当它读取文件时,它自己将 LF 视为行中的一个字符,因此它基本上将整个文件视为一行,正如 J.Chomel 之前建议的那样。

您可以使用实用程序转换行尾,或者通过将代码更改为:

            sb.append("\r\n");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多