Xport เป็นรูปแบบแฟ้มไบนารีที่ใช้โดยพวงของหน่วยงานของรัฐบาลสหรัฐสำหรับการเผยแพร่ข้อมูลชุด & nbsp;. มันทำให้ความรู้สึกมากถ้าคุณกำลังพยายามที่จะอ่านไฟล์ข้อมูลบนเมนเฟรมของไอบีเอ็มของคุณกลับมาในปี 1988
ฉันจะใช้มันอย่างไร?
ขอให้สั้นและหวานนี้:
นำเข้า Xport
กับ xport.XportReader (xport_file) เป็นผู้อ่าน:
& nbsp; แถวในอ่าน:
& nbsp; แถวพิมพ์
แต่ละแถวจะ Dict ที่มีคีย์สำหรับแต่ละเขตข้อมูลในชุด ค่าจะเป็นได้ทั้งสตริง Unicode, ลอยหรือ int ขึ้นอยู่กับชนิดที่ระบุไว้ในไฟล์สำหรับข้อมูลที่
การเดินทางข้อมูลไฟล์
เมื่อคุณมีวัตถุ XportReader มีคุณสมบัติไม่กี่และวิธีการที่จะให้รายละเอียดเกี่ยวกับแฟ้ม:
- reader.file: วัตถุไฟล์หลามพื้นฐาน (ดูหัวข้อถัดไป)
- reader.record_start: ตำแหน่ง (ไบต์) ในไฟล์ที่บันทึกเริ่มต้น (ดูหัวข้อถัดไป)
& nbsp; reader.record_length ยาว (ในไบต์) ของแต่ละระเบียน (ดูหัวข้อถัดไป)
- reader.record_count (): จำนวนของระเบียนในแฟ้ม (คำเตือน: นี้จะพยายามที่จะสิ้นสุดของแฟ้มเพื่อกำหนดความยาวไฟล์.)
- reader.file_info และ reader.member_info: dicts มีข้อมูลเกี่ยวกับเวลาและวิธีการชุดข้อมูลที่ถูกสร้างขึ้น
- reader.fields: รายการของเขตข้อมูลในชุด ข้อมูลแต่ละ Dict ที่มีคีย์ต่อไปนี้คัดลอกมาจากข้อมูลจำเพาะ:
& nbsp; struct {NAMESTR
& nbsp; nType สั้น; / * ชนิดตัวแปร: 1 = ตัวเลข 2 = char * /
& nbsp; nhfun สั้น; / * กัญชาของ NNAME (เสมอ 0) * /
& nbsp; * field_length สั้น; / * ความยาวของตัวแปรสังเกต * /
& nbsp; nvar0 สั้น; / * * * * * * * * VARNUM /
& nbsp; * ชื่อ char8; / * ชื่อของตัวแปร * /
& nbsp; * ป้าย char40; / * LABEL ของตัวแปร * /
& nbsp; char8 nform; / * ชื่อของรูปแบบ * /
& nbsp; สั้น nfl; / * ความยาวเขตข้อมูลรูปแบบหรือ 0 * /
& nbsp; * num_decimals สั้น; * / จำนวนรูปแบบทศนิยม * /
& nbsp; NFJ สั้น; / * 0 = เหตุผลซ้าย 1 = เพียงขวา * /
& nbsp; ถ่าน nfill [2]; / * (ไม่ได้ใช้สำหรับการจัดตำแหน่งและในอนาคต) * /
& nbsp; char8 niform; / * ชื่อของรูปแบบสัญญาณ * /
& nbsp; สั้น NIFL; / * INFORMAT ยาว ATTRIBUTE * /
& nbsp; Nifd สั้น; / * INFORMAT จำนวนทศนิยม * /
& nbsp; nPos ยาว / * ตำแหน่งของมูลค่าในการสังเกต * /
& nbsp; ส่วนที่เหลือถ่าน [52]; / * ฟิลด์ที่เหลือไม่เกี่ยวข้อง * /
& nbsp;};
& nbsp; หมายเหตุ: รายการที่มีดาวได้รับการเปลี่ยนชื่อจากชื่อสั้น ๆ ที่ระบุในสเปค ตั้งแต่นี้เป็นรุ่นอัลฟา, รายการอื่น ๆ ที่อาจจะมีการเปลี่ยนชื่อในอนาคตถ้ามีคนบอกฉันว่าพวกเขากำลังสำหรับ
การเข้าถึงแบบสุ่มบันทึก
ถ้าคุณต้องการที่จะเข้าถึงข้อมูลที่เฉพาะเจาะจงแทน iterating คุณสามารถใช้ไฟล์มาตรฐานหลามของฟังก์ชั่นการเข้าถึงและคณิตศาสตร์เล็ก ๆ น้อย ๆ
ได้รับการบันทึก 1000:
reader.file.seek (reader.record_start + reader.record_length * 1000, 0)
reader.next ()
ได้รับการบันทึกก่อนที่หนึ่งล่าสุดเรียก:
reader.file.seek (-reader.record_length * 2, 1)
reader.next ()
รับระเบียนสุดท้าย:
reader.file.seek (reader.record_start + reader.record_length * (reader.record_count () - 1), 0)
reader.next ()
(ในตัวอย่างล่าสุดนี้ทราบว่าเราไม่สามารถแสวงหาจากจุดสิ้นสุดของแฟ้มเพราะอาจจะมีไบต์ padding. ดีเก่าความกว้างคงรูปแบบไฟล์ไบนารี.)
โปรดแก้ไข / ขโมยรหัสนี้!
ที่ผมเขียนนี้ขึ้นเพราะมันดูเหมือนไร้สาระว่าไม่มีวิธีที่ง่ายต่อการอ่านรูปแบบข้อมูลมาตรฐานของรัฐบาลมากที่สุดในการเขียนโปรแกรมภาษา ผมอาจจะได้รับสิ่งที่ไม่ถูกต้อง หากคุณพบไฟล์ที่ไม่ได้ถอดรหัส propery ส่งคำขอดึง สเปคอย่างเป็นทางการอยู่ที่นี่ มันเป็นเรื่องที่น่าแปลกใจตรงไปตรงมาสำหรับรูปแบบไฟล์ไบนารีจาก 80
โปรดอย่าลังเลที่จะใช้รหัสนี้เป็นฐานในการเขียนห้องสมุดของคุณเองสำหรับการเขียนโปรแกรมภาษาที่คุณชื่นชอบ . ข้อมูลที่รัฐบาลควรจะสามารถเข้าถึงคน
ต้องการ
- หลาม
ความคิดเห็นที่ไม่พบ