【问题标题】:Reformat wide Excel table to more SQL-friendly structure将宽 Excel 表重新格式化为对 SQL 更友好的结构
【发布时间】:2017-08-01 22:14:30
【问题描述】:

我有一个非常宽的 Excel 表格,来自 A 列 - DIE(大约 2500 列宽),包含调查数据。每列是一个问题,每一行是一个响应。我正在尝试将数据上传到 SQL 并使用 UNPIVOT 函数将其转换为对 SQL 更友好的格式,但我什至无法将其加载到 SQL 中,因为它超过了 1024 列的限制。

基本上,我有一个如下所示的 Excel 工作表:

但我想把它转换成这样:

在 Excel(上传之前)或 SQL(同时规避 1024 列限制)中,我必须使用哪些选项来进行此更改?

【问题讨论】:

  • 制作一个VB脚本在你把它放入SQL之前进行转换
  • 如果我这样做,我最终会得到远远超过 Excel 的 100 万行限制
  • 您将不得不分批执行此操作。至少可以说,在非规范化结构中有 2,500 列,您已经为自己创造了一个挑战。
  • 我希望这是一个自创的挑战。我继承了一些设计不佳的调查数据,必须将其放入 SQL 中以备将来使用。还有大约 10 年的价值,每年有 1 年:(
  • stackoverflow.com/questions/36365839/… 但将最终数组写入文件而不是将其放在工作表上

标签: sql sql-server excel


【解决方案1】:

我不得不这样做。我的解决方案是编写一个 Python 脚本,该脚本将取消交叉表 CSV 文件(通常从 Excel 导出),创建另一个 CSV 文件。 Python 代码在这里:https://pypi.python.org/pypi/un-xtab/,文档在这里:http://pythonhosted.org/un-xtab/。我从来没有在一个有 2500 列的文件上运行它,但不知道为什么它不起作用。

【讨论】:

  • 这看起来很棒。让我试试看。谢谢:)
【解决方案2】:

R 在其中一个库中有一个非常具体的函数调用。您还可以使用 R 将数据连接、读取和写入数据库。建议下载 R 和 Rstudio。

下面是一个工作脚本,可帮助您开始做您需要的工作:

样本数据:

df <- data.frame(id = c(1,2,3), question_1 = c(1,0,1), question_2 = c(2,0,2))
df

输入表:

  id question_1 question_2
1  1          1          2
2  2          0          0
3  3          1          2

转置数据的代码:

df2 <- gather(df, key = id, value = values)
df2

输出:

   id        id values
1  1 question_1      1
2  2 question_1      0
3  3 question_1      1
4  1 question_2      2
5  2 question_2      0
6  3 question_2      2

一些帮助您导入和导出 csv 数据的函数:

# Install and load the necessary libraries
install.packages(c('tidyr','readr'))
library(tidyr)
library(readr)

# to read a csv file
df <- read_csv('[some directory][some filename].csv')

# To output the csv file
write.csv(df2, '[some directory]data.csv', row.names = FALSE)

【讨论】:

    【解决方案3】:

    感谢所有帮助。由于 SQL(超过 1024 列宽)和 Excel(输出中超过 100 万行)的限制,我最终使用了 Python。我从 rd_nielson 的代码中借用了这些概念,但这比我需要的要复杂一些。如果它对其他人有帮助,这是我使用的代码。它输出一个包含 3 列和 1400 万行的 csv 文件,我可以将其上传到 SQL。

    import csv
    
    with open('Responses.csv') as f:
        reader = csv.reader(f)
        headers = next(reader)  # capture current field headers
        newHeaders = ['ResponseID','Question','Response']  # establish new header names
        with open('PythonOut.csv','w') as outputfile:
            writer=csv.writer(outputfile, dialect='excel', lineterminator='\n')  
            writer.writerow(newHeaders)  # write new headers to output
    
            QuestionHeaders = headers[1:len(headers)]  # Slice the question headers from original header list
            for row in reader:
                questionCount = 0  # start counter to loop through each question (column) for every response (row)
                while questionCount <= len(QuestionHeaders) - 1:  
                    newRow = [row[0], QuestionHeaders[questionCount], row[questionCount + 1]]  
                    writer.writerow(newRow)
                    questionCount += 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2013-02-03
      相关资源
      最近更新 更多