咨询:如何匹配PS文件1-8字节成员名与PDS成员并生成包含匹配成员的目标PDS文件
Hey Harry, great question—since we're dealing with z/OS PDS and PS files, there are a few straightforward approaches depending on your environment and comfort level with tools. Let's walk through them:
This is the most native, low-code approach for z/OS environments, leveraging tools you likely already have access to:
Extract member names from the PS file
First, we'll pull the 8-byte member names from your PS file and format them into an IEBCOPY-compatible include list. Assuming your PS file usesRECFM=F,LRECL=8(each record is exactly one 8-byte member name), use this DFSORT job to generate a complete IEBCOPY JCL://MAKECOPY EXEC PGM=SORT //SYSOUT DD SYSOUT=* //SORTIN DD DSN=YOUR.PS.MEMBER.NAMES,DISP=SHR //SORTOUT DD DSN=YOUR.IEBCOPY.CNTL,DISP=(NEW,CATLG), // UNIT=SYSDA,SPACE=(TRK,(1,1)),RECFM=FB,LRECL=80 //SYSIN DD * OPTION COPY /* Format each 8-byte member into an INCLUDE line */ OUTREC FIELDS=(1:C' INCLUDE MEMBER=(',2:1,8,11:C')',80X) /* Wrap everything in a valid IEBCOPY JCL */ OUTFIL REMOVECC,NODETAIL, HEADER1=(1:'//COPYMEMB EXEC PGM=IEBCOPY',80X), HEADER2=(1:'//SYSPRINT DD SYSOUT=*',80X), HEADER3=(1:'//SYSUT1 DD DSN=YOUR.INPUT.PDS,DISP=SHR',80X), HEADER4=(1:'//SYSUT2 DD DSN=YOUR.OUTPUT.PDS,DISP=(NEW,CATLG),',80X), HEADER5=(1:'// UNIT=SYSDA,SPACE=(CYL,(1,1,5))',80X), HEADER6=(1:'//SYSIN DD *',80X), TRAILER1=(1:'/*',80X) /*Run the generated JCL
Submit the output JCL from the step above. IEBCOPY will automatically copy only the members listed in the include statements from your input PDS to the new output PDS.
If you need to handle edge cases (like non-standard PS file formatting, or extra validation), a REXX script gives you more control:
/* REXX: Copy PDS members matching names from a PS file */ PARSE ARG ps_dsn input_pds output_pds /* Read all member names from the PS file */ "ALLOC FI(PSFILE) DA('"ps_dsn"') SHR REUSE" "EXECIO * DISKR PSFILE (STEM MEMNAMES. FINIS" "FREE FI(PSFILE)" /* Build a comma-separated member list */ mem_list = "" DO i = 1 TO MEMNAMES.0 mem = LEFT(MEMNAMES.i,8) /* Ensure we only take first 8 bytes */ IF mem_list = "" THEN mem_list = mem ELSE mem_list = mem_list","mem END /* Generate IEBCOPY control statements and run the utility */ "ALLOC FI(SYSIN) DA('&&TMPCNTL') NEW SPACE=(TRK,(1))" "EXECIO 2 DISKW SYSIN (STEM CNTL. FINIS" CNTL.1 = " COPY OUTDD=SYSUT2,INDD=SYSUT1" CNTL.2 = " INCLUDE MEMBER=("mem_list")" "ALLOC FI(SYSUT1) DA('"input_pds"') SHR REUSE" "ALLOC FI(SYSUT2) DA('"output_pds"') NEW CATLG SPACE=(CYL,(1,1,5))" "CALL 'SYS1.LINKLIB(IEBCOPY)'" /* Clean up and confirm */ "FREE FI(SYSUT1 SYSUT2 SYSIN)" SAY "Completed! Copied "MEMNAMES.0" matching members to "output_pds EXIT
Save this as a PDS member, then run it with:
EXEC 'YOUR.REXX.LIB(MEMCOPY)' 'YOUR.PS.MEMBER.NAMES' 'YOUR.INPUT.PDS' 'YOUR.OUTPUT.PDS'
If you can export the PS file and input PDS members to a Windows/Linux machine, Python offers a simple, readable solution:
Extract member names from the PS file
# Read 8-byte member names from the binary PS file member_names = [] with open("ps_file_exported.bin", "rb") as f: while chunk := f.read(8): # Convert to ASCII, strip any trailing padding (spaces/NULLs) mem_name = chunk.decode("ascii").strip() if mem_name: member_names.append(mem_name.upper()) # Match z/OS uppercase namingCopy matching members to a new output directory
import os import shutil input_pds_path = "./exported_input_pds" # Directory with all input PDS members output_pds_path = "./output_pds_members" os.makedirs(output_pds_path, exist_ok=True) for mem_name in member_names: source_file = os.path.join(input_pds_path, mem_name) if os.path.exists(source_file): shutil.copy(source_file, os.path.join(output_pds_path, mem_name)) print(f"Copied: {mem_name}") else: print(f"Warning: Member {mem_name} not found in input PDS")After copying, you can zip the output directory and import it back to z/OS as a new PDS using IDCAMS or IEBCOPY.
Key Notes to Remember:
- Case Sensitivity: z/OS PDS member names are uppercase by default—ensure your extracted names are converted to uppercase to avoid matching failures.
- PS File Format: Confirm your PS file uses fixed-length 8-byte records. If it's a binary stream with no record delimiters, adjust the Python/REXX code to read 8-byte chunks sequentially.
- Output PDS Space: When creating the output PDS, allocate enough directory blocks (the third number in
SPACE=(CYL,(1,1,5))) to fit all matching members.
内容的提问来源于stack exchange,提问作者Harry

