sas2parquet 0.1.5__py3-none-any.whl → 0.1.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- sas2parquet/cli.py +20 -8
- sas2parquet/convert.py +7 -1
- {sas2parquet-0.1.5.dist-info → sas2parquet-0.1.8.dist-info}/METADATA +8 -6
- sas2parquet-0.1.8.dist-info/RECORD +8 -0
- sas2parquet-0.1.5.dist-info/RECORD +0 -8
- {sas2parquet-0.1.5.dist-info → sas2parquet-0.1.8.dist-info}/WHEEL +0 -0
- {sas2parquet-0.1.5.dist-info → sas2parquet-0.1.8.dist-info}/entry_points.txt +0 -0
- {sas2parquet-0.1.5.dist-info → sas2parquet-0.1.8.dist-info}/licenses/LICENSE +0 -0
sas2parquet/cli.py
CHANGED
|
@@ -3,22 +3,34 @@
|
|
|
3
3
|
import argparse
|
|
4
4
|
import sys
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
|
|
6
|
+
import importlib.metadata
|
|
7
|
+
|
|
8
|
+
# Get version from installed package metadata (works everywhere)
|
|
9
|
+
try:
|
|
10
|
+
__version__ = importlib.metadata.version("sas2parquet")
|
|
11
|
+
except importlib.metadata.PackageNotFoundError:
|
|
12
|
+
__version__ = "dev" # During development
|
|
13
|
+
|
|
14
|
+
from .convert import main as _convert_main, reconvert_file_ultimate
|
|
7
15
|
|
|
8
16
|
def main():
|
|
9
17
|
parser = argparse.ArgumentParser(description="SAS to Parquet converter")
|
|
18
|
+
parser.add_argument("--version", action="version", version=f"%(prog)s {__version__}")
|
|
10
19
|
parser.add_argument("sas_file", nargs="?", help="Single SAS file to convert")
|
|
11
20
|
parser.add_argument("parquet_file", nargs="?", help="Output Parquet file")
|
|
12
|
-
parser.add_argument("--dir-mode", action="store_true",
|
|
21
|
+
parser.add_argument("--dir-mode", "-d", action="store_true",
|
|
13
22
|
help="Process entire SAS_INPUT_DIR (ignores file args)")
|
|
14
23
|
|
|
15
24
|
args = parser.parse_args()
|
|
16
25
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
26
|
+
if args.dir_mode:
|
|
27
|
+
_convert_main()
|
|
28
|
+
elif args.sas_file and args.parquet_file:
|
|
29
|
+
success = reconvert_file_ultimate(Path(args.sas_file), Path(args.parquet_file))
|
|
30
|
+
sys.exit(0 if success else 1)
|
|
31
|
+
else:
|
|
32
|
+
parser.print_help()
|
|
33
|
+
sys.exit(1)
|
|
22
34
|
|
|
23
35
|
if __name__ == "__main__":
|
|
24
|
-
main()
|
|
36
|
+
main()
|
sas2parquet/convert.py
CHANGED
|
@@ -386,8 +386,14 @@ def main():
|
|
|
386
386
|
print(f"\n🗂 Processing: {rel}")
|
|
387
387
|
|
|
388
388
|
# Mirror structure under parquetdata/ (which lives next to sasdata/)
|
|
389
|
-
pqf = (PARQUET_INPUT_DIR / rel).with_suffix('.parquet')
|
|
390
389
|
|
|
390
|
+
if rel.parent == Path("."):
|
|
391
|
+
pqf = (PARQUET_INPUT_DIR / rel.name).with_suffix(".parquet")
|
|
392
|
+
else:
|
|
393
|
+
parquet_dirs = [f"{p}_parquet" for p in rel.parent.parts]
|
|
394
|
+
pqf = (PARQUET_INPUT_DIR.joinpath(*parquet_dirs) / rel.name).with_suffix(".parquet")
|
|
395
|
+
|
|
396
|
+
|
|
391
397
|
reconvert_file_ultimate(sas, pqf)
|
|
392
398
|
print("-"*60)
|
|
393
399
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sas2parquet
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.8
|
|
4
4
|
Summary: SAS → Parquet Hybrid Converter & Validator
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Author: Zaman Ziabakhshganji
|
|
@@ -75,13 +75,15 @@ sas2parquet --dir-mode
|
|
|
75
75
|
|
|
76
76
|
```text
|
|
77
77
|
your-project/
|
|
78
|
-
├── sasdata/
|
|
78
|
+
├── sasdata/ # ← Put your .sas7bdat files here
|
|
79
79
|
│ ├── file1.sas7bdat
|
|
80
|
-
│ └──
|
|
81
|
-
|
|
80
|
+
│ └── subfolder/
|
|
81
|
+
│ └── nested.sas7bdat
|
|
82
|
+
├── parquetdata/ # ← AUTO-CREATED (mirrors sasdata/)
|
|
82
83
|
│ ├── file1.parquet
|
|
83
|
-
│ └──
|
|
84
|
-
└──
|
|
84
|
+
│ └── subfolder/
|
|
85
|
+
│ └── nested.parquet
|
|
86
|
+
└── logging/ # ← AUTO-CREATED (detailed logs)
|
|
85
87
|
└── conversion_20260205_1145.log
|
|
86
88
|
```
|
|
87
89
|
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
sas2parquet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
sas2parquet/cli.py,sha256=vzsl6zSIctYh9yl1uOF4oSNTUV6TE41uFGOqSJHEYsY,1275
|
|
3
|
+
sas2parquet/convert.py,sha256=ukR3HYJDd2iP8OIWeSG7JfEU9fFEtsVlrI5nmLlrTbk,15003
|
|
4
|
+
sas2parquet-0.1.8.dist-info/METADATA,sha256=306RgqDcXk-qNbgnJWpZpNo9DDDONOLNqj5lMPnrG8M,3991
|
|
5
|
+
sas2parquet-0.1.8.dist-info/WHEEL,sha256=3ny-bZhpXrU6vSQ1UPG34FoxZBp3lVcvK0LkgUz6VLk,88
|
|
6
|
+
sas2parquet-0.1.8.dist-info/entry_points.txt,sha256=pg57h0xD_3R9ZC_YfxLLfu_2p1JNhF8xDNS6v7kiSBY,52
|
|
7
|
+
sas2parquet-0.1.8.dist-info/licenses/LICENSE,sha256=ouRycIMUGF1zCj49-ijn1wIlTNknZEoLwAHUp0ifH-g,1066
|
|
8
|
+
sas2parquet-0.1.8.dist-info/RECORD,,
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
sas2parquet/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
sas2parquet/cli.py,sha256=Gap4-lrHE3a-tOTRljqmRP6uX-epLFHnOYN0pdffU-g,879
|
|
3
|
-
sas2parquet/convert.py,sha256=bHfdtaI1sSeCSHKqARuuvbwgrNfnH1G_odKSEmVbNrI,14736
|
|
4
|
-
sas2parquet-0.1.5.dist-info/METADATA,sha256=nJNYKUGDINBS4M0Et6r2NRruczmd_v1NepPi5xdTHnU,3786
|
|
5
|
-
sas2parquet-0.1.5.dist-info/WHEEL,sha256=3ny-bZhpXrU6vSQ1UPG34FoxZBp3lVcvK0LkgUz6VLk,88
|
|
6
|
-
sas2parquet-0.1.5.dist-info/entry_points.txt,sha256=pg57h0xD_3R9ZC_YfxLLfu_2p1JNhF8xDNS6v7kiSBY,52
|
|
7
|
-
sas2parquet-0.1.5.dist-info/licenses/LICENSE,sha256=ouRycIMUGF1zCj49-ijn1wIlTNknZEoLwAHUp0ifH-g,1066
|
|
8
|
-
sas2parquet-0.1.5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|