【问题标题】:How to convert large .sav file into csv file如何将大型 .sav 文件转换为 csv 文件
【发布时间】:2020-05-22 23:38:56
【问题描述】:

我正在尝试使用 Python 将一个 ~2GB 的 SPSS (.SAV) 大文件转换为 CSV。

如果有一个大小

import pandas as pd
df = pd.read_spss('stdFile.sav')
df.to_csv("stdFile.csv", encoding = "utf-8-sig")

但在这种情况下,我得到了 MemoryError...

我期待解决方案,不一定是 Python。但我没有 SPSS 许可证,所以我必须使用其他工具转换文件。

【问题讨论】:

  • 你能分享一些你的台词sav file 吗?
  • 这可能会有所帮助:youtube.com/watch?v=yPaPZDg6JAA [YouTube - 将 SPSS (.sav) 转换为文本 (.csv)]
  • 如果您对R 感到满意,您可以使用包havenforeign 读取.sav 文件,然后您可以使用base R 或@987654328 @package 写出一个.csv
  • 我刚刚尝试了你的选项,使用 R: library(foreign) write.table(read.spss("inputfile.sav"), file="outputfile.csv", quote = FALSE, sep = ",") 现在的问题是,我得到了很多空格!原始文件是 .SAV(2GB),结果是 .CSV(6GB) 我必须阅读更多关于 R 的内容,然后再次报告,这是我第一次使用 R-Gui。但无论如何,我现在可以使用 python 处理块来清除 CSV。但我会再试一次R

标签: python csv spss


【解决方案1】:

可以使用python的pyreadstat包分块读取spss文件,并将每个块保存到csv中:

import pyreadstat
fpath = "path/to/stdFile.sav"
outpath = "stdFile.csv"
# chunksize determines how many rows to be read per chunk
reader = pyreadstat.read_file_in_chunks(pyreadstat.read_sav, fpath, chunksize= 10000)

cnt = 0
for df, meta in reader:
    # if on the first iteration write otherwise append
    if cnt>0:
        wmode = "a"
        header = False
    else:
        wmode = "w"
        header = True
    # write
    df.to_csv(outpath, mode=wmode, header=header)
    cnt+=1


更多信息在这里:https://github.com/Roche/pyreadstat#reading-rows-in-chunks

【讨论】:

  • 分块阅读是完美的解决方案,这篇文章中的逻辑也很完美。谢谢!
【解决方案2】:

先导入模块savReaderWriter,将.sav文件转成结构化数组,再导入模块numpy,将结构化数组转成csv:

pip install savReaderWriter

savReaderWriter

import savReaderWriter 
import numpy as np

reader_np = savReaderWriter.SavReaderNp("stdFile.sav")
array = reader_np.to_structured_array("outfile.dat") 
np.savetxt("stdFile.csv", array, delimiter=",")
reader_np.close()

【讨论】:

    猜你喜欢
    • 2020-01-13
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 2018-12-09
    • 2018-07-14
    相关资源
    最近更新 更多