#[cfg(feature = "python")]
#[global_allocator]
static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
pub(crate) mod arrow_convert;
pub(crate) mod columnar;
pub(crate) mod compression;
pub mod constants;
pub(crate) mod dictionary;
pub(crate) mod document;
pub(crate) mod encoding;
pub mod error;
pub(crate) mod header;
pub(crate) mod info_records;
pub(crate) mod io_utils;
pub mod metadata;
pub mod scanner;
pub(crate) mod value_labels;
pub(crate) mod variable;
pub mod writer;
#[cfg(feature = "python")]
mod python;
use std::fs::File;
use std::io::{BufReader, Read, Seek};
use std::path::Path;
use arrow::record_batch::RecordBatch;
use crate::error::Result;
use crate::scanner::SavScanner;
pub use crate::constants::{Alignment, Compression, Measure};
pub use crate::metadata::{MissingSpec, MrSet, MrType, SpssMetadata, Value};
pub use crate::scanner::SavScanner as Scanner;
pub use crate::writer::{write_sav, write_sav_to_writer};
pub fn read_sav(path: impl AsRef<Path>) -> Result<(RecordBatch, SpssMetadata)> {
let mut scanner = scan_sav(path)?;
let metadata = scanner.metadata().clone();
let batch = scanner.collect_single()?;
Ok((batch, metadata))
}
pub fn read_sav_from_reader<R: Read + Seek>(reader: R) -> Result<(RecordBatch, SpssMetadata)> {
let mut scanner = scan_sav_from_reader(reader, usize::MAX)?;
let metadata = scanner.metadata().clone();
let batch = scanner.collect_single()?;
Ok((batch, metadata))
}
pub fn read_sav_metadata(path: impl AsRef<Path>) -> Result<SpssMetadata> {
let file = File::open(path)?;
let buf_reader = BufReader::with_capacity(64 * 1024 * 1024, file);
let scanner = SavScanner::open(buf_reader, 0)?;
Ok(scanner.metadata().clone())
}
pub fn scan_sav(path: impl AsRef<Path>) -> Result<SavScanner<BufReader<File>>> {
let file = File::open(path)?;
let buf_reader = BufReader::with_capacity(64 * 1024 * 1024, file);
SavScanner::open(buf_reader, 100_000)
}
pub fn scan_sav_from_reader<R: Read + Seek>(reader: R, batch_size: usize) -> Result<SavScanner<R>> {
SavScanner::open(reader, batch_size)
}