diff --git a/images/Key-card.jpg b/Key-card.jpg
similarity index 100%
rename from images/Key-card.jpg
rename to Key-card.jpg
diff --git a/images/Example of programming analysis.html b/images/Example of programming analysis.html
deleted file mode 100644
index 01ffac3..0000000
--- a/images/Example of programming analysis.html
+++ /dev/null
@@ -1,692 +0,0 @@
-
-
-
-
-
-
- Customer 120200, Cabinet Cab1
-
-
-
-
-
-
-
-
-
-
-Customer: Noah Durham, National Archives and Records Administration (Customer #120200)
-
-
-
-Format Analysis:
- The cards appear to be database records.
- Numerous format types were seen. Each format was given its own coloration pattern.
- Fields which appear to be separate have been given separate colors.
- Sometimes an initial guess at the formatting helps the anomaly detector to highlight clues and errors
- and additional record types.
-
-Zoom and Sizing:
- To fit this page into your browser, press Control-Minus and Control-Plus to adjust the zoom for easier viewing.
-
-Anomalies: We ran a statistical analysis on each column of your data.
- Cards of different formats were analyzed separately.
- Statistical anomalies are highlighted in red.
- Our anomaly detector can help you find data integrity problems.
- To see the details, mouse over each red block.
-
- Not all anomalies are errors. Anomalies can be good things, representing the totals and extremes that define your data best.
- Computer scientists and philosophers like to say that The Unusual and The Unexpected are where Information lies.
- Our Anomaly Detector may point out the most interesting parts of your data.
- These could be your proverbial needles in the haystack, made visible by numerical analysis.
-
- Anomalous characters were identified as those characters which rarely occurred in each column.
-
-
-
-Color Key: card numbers, scan numbers, rulers, well-formatted data, sequence numbers, anomalies.
-
-
-Customer 120200, Cabinet Cab1
-Cabinet Cab1
-
- 12345678901234567890123456789012345678901234567890123456789012345678901234567890
- 1 2 3 4 5 6 7 8
-
- 1: 0163-MOTOR-TRANSPORT-CO-------218170096 0702 C01D01L-0001.tif
- 2: 0162-MOTOR-TRANSPORT-CO-------218170096 0702 C01D01L-0002.tif
- 3: 0162-TC-CO 218150073 0687 C01D01L-0003.tif
- 4: 0161-TC-CO 218150073 0687 C01D01L-0004.tif
- 5: 0161-MOTOR-TRANSPORT-CO 218170092 0698 C01D01L-0005.tif
- 6: 0161-MOTOR-TRANSPORT-CO-------218170096 0702 C01D01L-0006.tif
- 7: 0160-MOTOR-TRANSPORT-CO 218170092 0698 C01D01L-0007.tif
- 8: 0160 TC CO 218 218150073 0687 C01D01L-0008.tif
- 9: 0159-TC-CO 218150073 0687 C01D01L-0009.tif
- 10: 0158-TC-CO 218150073 0687 C01D01L-0010.tif
- 11: 0157-TC-CO 218150073 0687 C01D01L-0011.tif
- 12: 0156 TC CO 218150073 0687 C01D01L-0012.tif
- 13: 0155-TC-CO 218150073 0687 C01D01L-0013.tif
- 14: 0154-MOTOR-TRANSPORT-CO-------218170096 0702 C01D01L-0014.tif
- 15: 0154-TC-CO 218150073 0687 C01D01L-0015.tif
- 16: 0153-TC-CO 218150073 0687 C01D01L-0016.tif
- 17: 0153-MOTOR-TRANSPORT-CO-------218170096 0702 C01D01L-0017.tif
- 18: 0152-MOTOR-TRANSPORT-CO-------218170096 0702 C01D01L-0018.tif
- 19: 0152-TC-CO 218150073 0687 C01D01L-0019.tif
- 20: 0151-TC-CO 218150073 0687 C01D01L-0020.tif
- 21: 0151-TC-CO 218150073 0687 C01D01L-0021.tif
- 22: 0151-MOTOR-TRANSPORT-CO-------218170096 0702 C01D01L-0022.tif
- 23: 0150-MOTOR-TRANSPORT-CO MICH 218170092 0698 C01D01L-0023.tif
- 24: 0150-MOTOR-TRANSPORT-CO 218170092 0698 C01D01L-0024.tif
- 25: 0150-MOTOR-TRANSPORT-CO-------218170096 0702 C01D01L-0025.tif
- 26: 0150-TC-CO 218150073 0687 C01D01L-0026.tif
- 27: 0149-TC-CO 218150073 0687 C01D01L-0027.tif
- 28: 0148-TC-CO 218150073 0687 C01D01L-0028.tif
- 29: 0147-TC-CO 218150073 0687 C01D01L-0029.tif
- 30: 0146-TC-CO 218150073 0687 C01D01L-0030.tif
- 31: 0145-TC-CO 218150072 0686 C01D01L-0031.tif
- 32: 0144-MOTOR-TRANSPORT-CO-------218170096 0702 C01D01L-0032.tif
- 33: 0144-TC-CO 218150072 0686 C01D01L-0033.tif
- 34: 0143-MOTOR-TRANSPORT-CO-------218170096 0702 C01D01L-0034.tif
- 35: 0143-TC-CO 218150072 0686 C01D01L-0035.tif
- 36: 0142-MOTOR-TRANSPORT-CO-------218170096 0702 C01D01L-0036.tif
- 37: 0142-TC-CO 218150072 0686 C01D01L-0037.tif
- 38: 0141-MOTOR-TRANSPORT-CO 218170092 0698 C01D01L-0038.tif
- 39: 0141-MOTOR-TRANSPORT-CO-------218170096 0702 C01D01L-0039.tif
- 40: 0141-TC-CO 218150072 0686 C01D01L-0040.tif
- 41: 0140-MOTOR-TRANSPORT-CO 218170092 0698 C01D01L-0041.tif
- 42: 0140-MOTOR-TRANSPORT-CO-------218170096 0702 C01D01L-0042.tif
- 43: 0139-TC-CO 218150072 068W C01D01L-0043.tif
- 44: 0138-TC-CO 218150072 0686 C01D01L-0044.tif
- 45: 0137-TC-CO 218150072 0686 C01D01L-0045.tif
- 46: 0097+AERO SQDN 03050084 ILLEG FEB 1918 1220 C01D01R-0046.tif
- 47: 0097 OBSN SQDN OBSN +03050108 MITCHEL FLD LI NY 1244 C01D01R-0047.tif
- 48: 0098 SPRUCE SQDN 03050119 1255 C01D01R-0048.tif
- 49: 0098+AERO SQDN 03050084 1220 C01D01R-0049.tif
- 50: 0099 BOMB SQDN 6 AIR FORCE 03050104 MITCHEL FLD NY 1240 C01D01R-0050.tif
- 51: 0099+AERO SQDN 03050084 1220 C01D01R-0051.tif
- 52: 0099 SQDN OBSN +03050109 SEE ILLEG FILE 1245 C01D01R-0052.tif
- 53: 0099 OBSN SQDN OBSN +03050108 BOLLIN FLD WASH DC 1244 C01D01R-0053.tif
- 54: 0100 SPRUCE SQDN 03050119 1255 C01D01R-0054.tif
- 55: 0100+AERO SQDN 03050084 1220 C01D01R-0055.tif
- 56: 0101 SPRUCE SQDN 03050119 1255 C01D01R-0056.tif
- 57: 0101+AERO SQDN 03050084 1220 C01D01R-0057.tif
- 58: 0102 SPRUCE SQDN 03050119 1255 C01D01R-0058.tif
- 59: 0102+AERO SQDN 03050084 1220 C01D01R-0059.tif
- 60: 0103 SPRUCE SQDN 03050119 1255 C01D01R-0060.tif
- 61: 0103+AERO SQDN 03050084 1220 C01D01R-0061.tif
- 62: 0104 SPRUCE SQDN 03050119 1255 C01D01R-0062.tif
- 63: 0104+AERO SQDN 03050084 1220 C01D01R-0063.tif
- 64: 0105 SPRUCE SQDN 03050119 1255 C01D01R-0064.tif
- 65: 0105+AERO SQDN 03050084 1220 C01D01R-0065.tif
- 66: 0106 SPRUCE SQDN 03050119 1255 C01D01R-0066.tif
- 67: 0106+AERO SQDN 03050084 1220 C01D01R-0067.tif
- 68: 0106 AERO SQDN 03050097 REDES SQDN B BARRON FLD TEX 1233 C01D01R-0068.tif
- 69: 0106 DET AIR SERVICE 03050098 GERSTNER FLD LA 1234 C01D01R-0069.tif
- 70: 0107 SPRUCE SQDN 03050119 1255 C01D01R-0070.tif
- 71: 0107+AERO SQDN 03050084 1220 C01D01R-0071.tif
- 72: 0108 SPRUCE SQDN 03050119 1255 C01D01R-0072.tif
- 73: 0108+AERO SQDN 03050084 1220 C01D01R-0073.tif
- 74: 0109 SPRUCE SQDN 03050119 1255 C01D01R-0074.tif
- 75: 0005+MACH+GUN+BN 368040127 1095 C01D02L-0001.tif
- 76: 0006 AA MACH GUN BN 368040153 1121 C01D02L-0002.tif
- 77: 0007 MACH GUN TNG CTR GP 320040156 1124 C01D02L-0003.tif
- 78: 0007+MACH+GUN+BN 368040127 1095 C01D02L-0004.tif
- 79: 0008+MACH+GUN+BN 368040127 1095 C01D02L-0005.tif
- 80: 0009+MACH+GUN+BN 368040128 ILLEG HQ ORD DET MAR 1920 1096 C01D02L-0006.tif
- 81: 0010+MACH+GUN+BN 368040128 1096 C01D02L-0007.tif
- 82: 0011+MACH+GUN+BN 368040128 ILLEG DT MD JUN JUL AUG NOV 1918 109O C01D02L-0008.tif
- 83: 0012+MACH+GUN+BN 368040128 1096 C01D02L-0009.tif
- 84: 0013+MACH+GUN+BN 368040129 ILLEG CO A DEC 1917 JAN FEB MAR 1¿/¿7 C01D02L-0010.tif
- 85: 0014+MACH+GUN+BN 368040129 1097 C01D02L-0011.tif
- 86: 0015+MACH+GUN+BN 368040129 1097 C01D02L-0012.tif
- 87: 0016+MACH+GUN+BN 368040129 1097 C01D02L-0013.tif
- 88: 0017+MACH+GUN+BN 368040129 1097 C01D02L-0014.tif
- 89: 0018+MACH+GUN+BN 368040129 1097 C01D02L-0015.tif
- 90: 0019+MACH+GUN+BN 368040129 1097 C01D02L-0016.tif
- 91: 0015 HQ TR MP 073070007 1493 C01D02R-0017.tif
- 92: 0016+PW+ESCORT+CO+++++++++++++160020171- 0586 C01D02R-0018.tif
- 93: 0016MP CO 160070004 1490 C01D02R-0019.tif
- 94: 0016PROV MP CO 160070004 1490 C01D02R-0020.tif
- 95: 0016-PROV-GD-CO 160020174 0589 C01D02R-0021.tif
- 96: 0016+ADM+LABOR+CO+++++++++++++160020175- 0590 C01D02R-0022.tif
- 97: 0016+CIV+LABOR+CO 160020176 0591 C01D02R-0023.tif
- 98: 0016-DEPOT-SC-CO 160020177 0592 C01D02R-0024.tif
- 99: 0016 HQ TR MP 073070008 1494 C01D02R-0025.tif
- 100: 0017+PW+ESCORT+CO+++++++++++++160020171- 0586 C01D02R-0026.tif
- 101: 0017MP CO 160070004 1490 C01D02R-0027.tif
- 102: 0017PROV MP CO 160070004 1490 C01D02R-0028.tif
- 103: 0017-PROV-GD-CO 160020174 0589 C01D02R-0029.tif
- 104: 0017+ADM+LABOR+CO+++++++++++++160020175- 0590 C01D02R-0030.tif
- 105: 0017+CIV+LABOR+CO 160020176 0591 C01D02R-0031.tif
- 106: 0017-DEPOT-SC-CO 160020177 0592 C01D02R-0032.tif
- 107: 0017 HQ TR MP 073070008 1494 C01D02R-0033.tif
- 108: 0532+CASUAL CO- 352070237 1723 C01D03L-0001.tif
- 109: 0532+HOBOKEN+CASUAL CO- 352070238 1724 C01D03L-0002.tif
- 110: 0533+CASUAL CO- 352070237 1723 C01D03L-0003.tif
- 111: 0533+BORDEAUX+SPEC+CAS+CO- 352070238 1724 C01D03L-0004.tif
- 112: 0533+HOBOKEN+CASUAL CO- 352070238 1724 C01D03L-0005.tif
- 113: 0534+HOBOKEN+CASUAL CO- 352070238 1724 C01D03L-0006.tif
- 114: 0535+HOBOKEN+CASUAL CO- 352070238 1724 C01D03L-0007.tif
- 115: 0536+CASUAL CO- 352070237 1723 C01D03L-0008.tif
- 116: 0536+HOBOKEN+CASUAL CO- 352070238 1724 C01D03L-0009.tif
- 117: 0537+HOBOKEN+CASUAL CO- 352070238 1724 C01D03L-0010.tif
- 118: 0538+CASUAL CO- 352070237 1723 C01D03L-0011.tif
- 119: 0538+HOBOKEN+CASUAL CO- 352070238 1724 C01D03L-0012.tif
- 120: 0539+CASUAL CO- 352070237 1723 C01D03L-0013.tif
- 121: 0539+HOBOKEN+CASUAL CO- 352070238 1724 C01D03L-0014.tif
- 122: 0540+CASUAL CO- 352070237 1723 C01D03L-0015.tif
- 123: 0692-MTC-CO 218020153 0568 C01D03R-0016.tif
- 124: 0693-MTC-CO 218020153 0568 C01D03R-0017.tif
- 125: 0694-MTC-CO 218020153 0568 C01D03R-0018.tif
- 126: 0694-MOTOR-TRUCK-CO-MTC 218020155 0570 C01D03R-0019.tif
- 127: 0695-MTC-CO 218020153 0568 C01D03R-0020.tif
- 128: 0696-MTC-CO 218020153 0568 C01D03R-0021.tif
- 129: 0697-MTC-CO 218020153 0568 C01D03R-0022.tif
- 130: 0698-MTC-CO 218020153 0568 C01D03R-0023.tif
- 131: 0699-MTC-CO 218020153 0568 C01D03R-0024.tif
- 132: 0700-MTC-CO 218020153 0568 C01D03R-0025.tif
- 133: 0701-MTC-CO 218020153 0568 C01D03R-0026.tif
- 134: 0702-MTC-CO 218020153 0568 C01D03R-0027.tif
- 135: 0703-MTC-CO 218020153 0568 C01D03R-0028.tif
- 136: QUARANTINE CP PONTANGEN 2630700485540 APO 716 1534 C01D04L-0001.tif
- 137: EMB MESS CP PONTANZEN FR 2630201845540 0599 C01D04L-0002.tif
- 138: MED DET SEP CP POTANEZEN FR 2630201845540 0599 C01D04L-0003.tif
- 139: MOTN PICT DET SC PONTANEZEN FR2630201865540 0601 C01D04L-0004.tif
- 140: PONTANEZEN REST CAMP FRANCE 2630201795540 0594 C01D04L-0005.tif
- 141: ORD DET PONT ROUSSEAU FR 2630201205540 0535 C01D04L-0006.tif
- 142: CASUALS 2630702425540CP PORTE FOY 1728 C01D04L-0007.tif
- 143: CASUAL CO 2630702425540RANNES FRANCE 1728 C01D04L-0008.tif
- 144: POST QM DET APO 774 RAV SUR 2630103135540 1746 C01D04L-0009.tif
- 145: ORD DET CP REDON APO 704 2630201205540 0535 C01D04L-0010.tif
- 146: MTC-RENNES FRANCE 2630201685540 0583 C01D04L-0011.tif
- 147: POST ENGR RIMACOURT FRANCE 2630201855540 0600 C01D04L-0012.tif
- 148: MTC-RIMANCOURT FRANCE 2630201685540 0583 C01D04L-0013.tif
- 149: HQ DET RIVEIERA LEAVE AREA 2630201805540 0595 C01D04L-0014.tif
- 150: MTC-ROMAYNE FRANCE 2630201685540 0583 C01D04L-0015.tif
- 151: MP DET ROUEN FR 2630700125540 1498 C01D04L-0016.tif
- 152: ARMY TRANS SERV ROUEN FR 2630201685540 0583 C01D04L-0017.tif
- 153: AERL GUN SCH AEF ST JEAN DMV 2630401745540 0679 C01D04L-0018.tif
- 154: CAS ARMY ENGR SCH FT ST MENG 2630401755540 0680 C01D04L-0019.tif
- 155: HQ CONV CTR CP SHERMAN OHIO 0000700515317 1537 C01D04R-0020.tif
- 156: PROV DET CP SHERMAN OHIO 0000700555317 1541 C01D04R-0021.tif
- 157: REC DT CA FT SHRMN OHIO 0000402305317 0736 C01D04R-0022.tif
- 158: CP SUPPLY DET QMC 0000202745317CP SHERMAN OHIO C01D04R-0023.tif
- 159: UTILITIES BR CONST DIV 0000202745317CP SHERMAN OHIO C01D04R-0024.tif
- 160: DET QM CORPS 0000202745317CP SHERMAN OHIO C01D04R-0025.tif
- 161: DET QM CORPS 0000202745317CP SHERMAN OHIO C01D04R-0026.tif
- 162: REPL DR CP SHERMAN OH 0000102985317 1731 C01D04R-0027.tif
- 163: REPL DR CP SHERMAN OHIO 0000102985317 1731 C01D04R-0028.tif
- 164: BAKERS COOKS SCH OHIO 0000401875317 0692 C01D04R-0029.tif
- 165: CP HQ CP SHERMAN OHIO 0000402115317 0717 C01D04R-0030.tif
- 166: CASUALS 0000702425317CP SHERMAN OHIO 1728 C01D04R-0031.tif
- 167: VET DET CP SHERMAN OHIO 0000701355317 1621 C01D04R-0032.tif
- 168: METERO DET CP SHERMAN PROV DET0000301875317 0945 C01D04R-0033.tif
- 169: PUBLIC SCH DIST 1 CIN OHIO 0000401645321 1132 C01D04R-0034.tif
- 170: OHIO MECHANICS INST OHIO 0000401645321 1132 C01D04R-0035.tif
- 171: CINCINNATI UNIV OHIO 0000401645321 1132 C01D04R-0036.tif
- 172: ST XAVIER COL OHIO 0000401645321 1132 C01D04R-0037.tif
- 173: RECRUITING STA 0000103055321CINCINNATI OHIO 1738 C01D04R-0038.tif
- 174: MED DET CINCINNATI OHIO 0000701195321 1605 C01D04R-0039.tif
- 175: 0032+CO 8 BN INF REPL CP 075070034- - 1070 C01D05L-0001.tif
- 176: 0032+CO+NEW+REC+CAMP+CP+WHLR- 075040165- - 1149 C01D05L-0002.tif
- 177: 0032+MP CO 064040096- +- 0756 C01D05L-0003.tif
- 178: 0032+CASUAL+CO- 068010043- - 0314 C01D05L-0004.tif
- 179: 0032+CAS+CO- 068020168- +- 1106 C01D05L-0005.tif
- 180: 0032+PROV+ORD+DEPOT+CO- 063050019 0808 C01D05L-0006.tif
- 181: 0032+DEPOT+LABOR+CO- 075010073- +SEE ILLEG FILE 0344 C01D05L-0007.tif
- 182: 0032+PWE+CO- 075010074- 0345 C01D05L-0008.tif
- 183: 0032+EVAC+AMB+CO- 075060069- +SEE ILLEG FILE 0984 C01D05L-0009.tif
- 184: 0032+SV+CO- 075050112- +SEE+ILLEG+FILE- 0901 C01D05L-0010.tif
- 185: 0032+BALLOON+CO- 075010029- - 0300 C01D05L-0011.tif
- 186: 0032+CO TRANS CORPS 101060005 0920 C01D05L-0012.tif
- 187: 0032+RCT+CO- 075040073- +SEE+ILLEG+FILE- 0733 C01D05L-0013.tif
- 188: 0032+CO+ 8+BN+151+DB+CP+DEVENS051060082- +SEE+ILLEG+FILE+++MASS- 0997 C01D05L-0014.tif
- 189: 0032+CO+8+TRG+BN+152+DEPOT+BRG051040161- - 1145 C01D05L-0015.tif
- 190: 0032 CO 8 TNG BN 153 D B 051060087- +CP DIX N J SEE ILLEG FILE 1002 C01D05L-0016.tif
- 191: 0032+CO+154TH+DEPOT+BRIG- 051020148- +- 1086 C01D05L-0017.tif
- 192: 0032+CO+8+TNG+BN+156+DEPOT+BRG051070011- - 1047 C01D05L-0018.tif
- 193: 0032+CO+8+TR+BN+159+DEPOT+BRIG051040145- SEE+ILLEG+FILE- 1129 C01D05L-0019.tif
- 194: 0032+CO+160+D+B+CP+CUSTER+MICH051060078- +SEE+ILLEG+FILE- 0993 C01D05L-0020.tif
- 195: 0032+CO+8TH+TNG+BN+162+DEP+BRG051020162- +- 1100 C01D05L-0021.tif
- 196: 0032 CO 8 BN 163 D B CP DODGE 051060094- +SEE ILLEG FILE 1009 C01D05L-0022.tif
- 197: 0500+MTR+TRUCK+CO- 066040106- SEE+ILLEG+FILE- 766- C01D05R-0023.tif
- 198: 0501+MTR+TRUCK+CO- 066040106- SEE+ILLEG+FILE- 766- C01D05R-0024.tif
- 199: 0502+MTR+TRUCK+CO- 066040106- SEE+ILLEG+FILE- 766- C01D05R-0025.tif
- 200: 0503+MTR+TRUCK+CO- 066040106- 766- C01D05R-0026.tif
- 201: 0504+MTR+TRUCK+CO- 066040106- SEE+ILLEG+FILE- 766- C01D05R-0027.tif
- 202: 0504+MBL+LDRY+CO- 075050074 0863 C01D05R-0028.tif
- 203: 0505+MTR+TRUCK+CO- 066040106- SEE+ILLEG+FILE- 766- C01D05R-0029.tif
- 204: 0506+MTR+TRUCK+CO- 066040106- SEE+ILLEG+FILE- 766- C01D05R-0030.tif
- 205: 0508+MTR+TRUCK+CO- 066040106- 766- C01D05R-0031.tif
- 206: 0509+MTR+TRUCK+CO- 066040106- SEE+ILLEG+FILE- 766- C01D05R-0032.tif
- 207: 0510+MTR+TRUCK+CO- 066040106- SEE+ILLEG+FILE- 766- C01D05R-0033.tif
- 208: 0510 LDRY CO 075050073 0862 C01D05R-0034.tif
- 209: 0511+MTR+TRUCK+CO- 066040106- SEE+ILLEG+FILE- 766- C01D05R-0035.tif
- 210: 0512+MTR+TRUCK+CO- 066040106- 766- C01D05R-0036.tif
- 211: 0512+MBL+LDRY+CO- 075050074 0863 C01D05R-0037.tif
- 212: 0513+MTR+TRUCK+CO- 066040103 763- C01D05R-0038.tif
- 213: 0516+MTR+TRUCK+CO- 066040103 763- C01D05R-0039.tif
- 214: 0517+MTR+TRUCK+CO- 066040103 SEE+ILLEG+FILE- 763- C01D05R-0040.tif
- 215: 0518+MTR+TRUCK+CO- 066040103 SEE+ILLEG+FILE- 763- C01D05R-0041.tif
- 216: 0616 AERO SUPPLY SQ 171010011 0282 C01D06L-0001.tif
- 217: 0616+AERO+SQ- 171010011 SEE ILLEG FILE 0282 C01D06L-0002.tif
- 218: 0617 AERO SUPPLY SQ 171010011 0282 C01D06L-0003.tif
- 219: 0617+AERO+SQ- 171010011 0282 C01D06L-0004.tif
- 220: 0618+AERO+SQ- 171010011 0282 C01D06L-0005.tif
- 221: 0618 AERO SUPPLY SQ 171010011 0282 C01D06L-0006.tif
- 222: 0620+AERO+SQ- 171010011 SEE ILLEG FILE 0282 C01D06L-0007.tif
- 223: 0621 AERO SUPPLY SQ 171010011 0282 C01D06L-0008.tif
- 224: 0621+AERO+SQ- 171010011 0282 C01D06L-0009.tif
- 225: 0622+AERO+SQ- 171010011 0282 C01D06L-0010.tif
- 226: 0623 AERO SUPPLY SQ 171010011 SEE ILLEG FILE 0282 C01D06L-0011.tif
- 227: 0623+AERO+SQ- 171010011 0282 C01D06L-0012.tif
- 228: 0624+AERO+SQ- 171010011 0282 C01D06L-0013.tif
- 229: 0624 AERO SUPPLY SQ 171010011 SEE ILLEG FILE 0282 C01D06L-0014.tif
- 230: 0625 AERO SUPPLY SQ 171010011 SEE ILLEG FILE 0282 C01D06L-0015.tif
- 231: 0625+AERO+SQ- 171010011 0282 C01D06L-0016.tif
- 232: 0125+AERO+SQ- 171010012 0283 C01D06L-0017.tif
- 233: 0626 AERO SQ 171010011 SEE ILLEG FILE 0282 C01D06L-0018.tif
- 234: 0627+AERO+SQ- 171010011 0282 C01D06L-0019.tif
- 235: SALV DIV CP CUSTER MICH 26006007620205SEE ILLEG FILE 0991 C01D06R-0020.tif
- 236: GUARD HOUSE CP CUSTR MICH26006007920205SEE+ILLEG+FILE- 0994 C01D06R-0021.tif
- 237: CONVALESCENCE CENTER 26006007920205CP CUSTER MICH 0994 C01D06R-0022.tif
- 238: AUSTIN COLL SATC DT MC 26005008620220 0875 C01D06R-0023.tif
- 239: +DETROIT MED COLL MC 26005008920220 0878 C01D06R-0024.tif
- 240: +GR RAPIDS COLL MC 26005009020360 0879 C01D06R-0025.tif
- 241: +HILLSDALE COLL MC 26005009020402 0879 C01D06R-0026.tif
- 242: +HOPE COLL HOLLAND MC 26005009020404 0879 C01D06R-0027.tif
- 243: +MICH COLL OF LANSING 26005009220496SEE ILLEG FILE 0881 C01D06R-0028.tif
- 244: +DET QMC FT WAYNE MICH 26004007420956SEE+ILLEG+FILE- 0734 C01D06R-0029.tif
- 245: MED DET FT WAYNE MICH 26006005420956- 0969 C01D06R-0030.tif
- 246: HQ DET MTC FT WAYNE MICH 26004007420956SEE ILLEG FILE 0734 C01D06R-0031.tif
- 247: +GUARDHOUSE FT WAYNE MICH 26004007420956SEE+ILLEG+FILE- 0734 C01D06R-0032.tif
- 248: +RCT DET MTC FT WAYNE MICH26004007420956SEE+ILLEG+FILE- 0734 C01D06R-0033.tif
- 249: +CARLETON ST OLAF 26005008721000NORTHLAND MINN 0876 C01D06R-0034.tif
- 250: +GUSTAVUS ALDOPHUS COLL 26005009021000ST PETERS MINN 0879 C01D06R-0035.tif
- 251: +MINNEAPOLIS MINN UNIV 26005009321588SEE ILLEG FILE 0882 C01D06R-0036.tif
- 252: +DUNWOODY INST MINN MINN 26005008921588 0878 C01D06R-0037.tif
- 253: 0004GPROV BN 10523 BASSENS CAMP +PD459 C01D07L-0001.tif
- 254: 0004GPROV RECT BN 10602 DEPOT DIV PD459 C01D07L-0002.tif
- 255: 0004GBN 10646 1 INF TRNG REGT ++++PD459 C01D07L-0003.tif
- 256: 0004GCORPS M P BN 09435 ++++PD459 C01D07L-0004.tif
- 257: 0004GBN 11321CP PIKE ARK REPL TRNG CTR PD459 C01D07L-0005.tif
- 258: 0004GBN INF REPL 11208CP LEE VA TRNG CAMP PD459 C01D07L-0006.tif
- 259: 0004GBN CAS CP 11231CP LEE VA ++++PD459 C01D07L-0007.tif
- 260: 0004GBN INF REPL 11265CP MAC ARTHUR TEX TRNG CP PD459 C01D07L-0008.tif
- 261: 0004GBN RECRUIT CP 11281CP MAC ARTHUR TEX PD459 C01D07L-0009.tif
- 262: 0004GTRAINING BN SC 05005FT LEAVENWORTH KANS PD459 C01D07L-0010.tif
- 263: 0004HBN 04291 OF 1 M M REGT +++PD459 C01D07L-0011.tif
- 264: 0004GDEPOT BN 04808SIG CORPS +++PD459 C01D07L-0012.tif
- 265: 0004GFLD+SIG+BN+S+C-04819- +++PD459 C01D07L-0013.tif
- 266: 0004GINF REPL BN 11121CP GORDON GA ++++PD459 C01D07L-0014.tif
- 267: 0004GTRNG BN 11122CP GORDON GA ++++PD459 C01D07L-0015.tif
- 268: 0004GBN ORD DET 01520ABERDEEN PROV GD MD PD459 C01D07L-0016.tif
- 269: 0262HCAS+CO- 09243PONTANEZEN+BKS+FRANCE- ++++PD459 C01D07R-0017.tif
- 270: 0262HPRIS+WAR+ESC+CO09001- ++++PD459 C01D07R-0018.tif
- 271: 0263HCAS+CO- 09243PONTANEZEN+BKS+FRANCE- ++++PD459 C01D07R-0019.tif
- 272: 0263HCAS+CO- 09243PONTANEZEN+BKS+FRANCE- ++++PD459 C01D07R-0020.tif
- 273: 0263HPRIS+WAR+ESC+CO09002- ++++PD459 C01D07R-0021.tif
- 274: 0264HCAS+CO- 09243PONTANEZEN+BKS+FRANCE- ++++PD459 C01D07R-0022.tif
- 275: 0264HPRIS+WAR+ESC+CO09003- ++++PD459 C01D07R-0023.tif
- 276: 0265HCAS+CO- 09243PONTANEZEN+BKS+FRANCE- ++++PD459 C01D07R-0024.tif
- 277: 0265HM+P+CO- 09567- ++++PD459 C01D07R-0025.tif
- 278: 0265HPRIS+WAR+ESC+CO09004- ++++PD459 C01D07R-0026.tif
- 279: 0266HCAS+CO- 09243PONTANEZEN+BKS+FRANCE- ++++PD459 C01D07R-0027.tif
- 280: 0266HM+P+CO- 09568- ++++PD459 C01D07R-0028.tif
- 281: 0266HPRIS+WAR+ESC+CO09005- ++++PD459 C01D07R-0029.tif
- 282: 0267HM+P+CO- 09569- ++++PD459 C01D07R-0030.tif
- 283: 0267HM+P+CO- 09570- ++++PD459 C01D07R-0031.tif
- 284: 0267HPRIS+WAR+ESC+CO09006- ++++PD459 C01D07R-0032.tif
- 285: 0268HCAS+CO- 09243PONTANEZEN+BKS+FRANCE- ++++PD459 C01D07R-0033.tif
- 286: 0268HM+P+CO- 09570- ++++PD459 C01D07R-0034.tif
- 287: 0268HPRIS+WAR+ESC+CO09007- ++++PD459 C01D07R-0035.tif
- 288: 0269HM+P+CO- 09571- ++++PD459 C01D07R-0036.tif
- 289: 0270HCAS+CO- 09243PONTANEZEN+BKS+FRANCE- ++++PD459 C01D07R-0037.tif
- 290: 0391JMACH+SHOP+TK+UT05825- +++PD459 C01D08L-0001.tif
- 291: 0392JSERV+PARK+UT- 09853- ++++PD459 C01D08L-0002.tif
- 292: 0392JMACH+SHOP+TK+UT05826- +++PD459 C01D08L-0003.tif
- 293: 0393JSERV+PARK+UT- 09854APO 745 ++++PD459 C01D08L-0004.tif
- 294: 0393JMACH+SHOP+TK+UT05827- +++PD459 C01D08L-0005.tif
- 295: 0394JSERV+PARK+UT- 09855- ++++PD459 C01D08L-0006.tif
- 296: 0394JMACH+SHOP+TK+UT05828- +++PD459 C01D08L-0007.tif
- 297: 0395JSERV+PARK+UT- 09856- ++++PD459 C01D08L-0008.tif
- 298: 0395JMACH+SHOP+TK+UT05829- +++PD459 C01D08L-0009.tif
- 299: 0396JSERV+PARK+UT- 09857- ++++PD459 C01D08L-0010.tif
- 300: 0396JMACH+SHOP+TK+UT05830- +++PD459 C01D08L-0011.tif
- 301: 0397JSERV+PARK+UT- 09858- ++++PD459 C01D08L-0012.tif
- 302: 0397JMACH+SHOP+TK+UT05831- +++PD459 C01D08L-0013.tif
- 303: 0000MQMC DET MGTC 08261CP HANCOCK GA 4300PD459 C01D08R-0014.tif
- 304: 0000MUTIL DIV QMC 08262CP HANCOCK GA 4300PD459 C01D08R-0015.tif
- 305: 0000MSUB DEPOT QM 07147CP HANCOCK GA 4300PD459 C01D08R-0016.tif
- 306: 0000MJULY AUG SEPT 09180CP HANCOCK GA AUTO REPL DRAFT 4300PD459 C01D08R-0017.tif
- 307: 0000MAUTO REPL DRAFT09192CP HANCOCK GA PROV UT 4300PD459 C01D08R-0018.tif
- 308: 0000MSPEC SCH MGTC 05523CP HANCOCK GA 4300PD459 C01D08R-0019.tif
- 309: 0000MMGTC DET 05524CP HANCOCK GA 4300PD459 C01D08R-0020.tif
- 310: 0000MMG SCHOOL MGTC 05525CP HANCOCK GA 4300PD459 C01D08R-0021.tif
- 311: 0000MEM TRNG DEPT 05526CP HANCOCK GA 4300PD459 C01D08R-0022.tif
- 312: 0000MMG SCH MGTC 05527CP HANCOCK GA 4300PD459 C01D08R-0023.tif
- 313: 0000MSPEC TRNG DEPOT05522CP HANCOCK GA 4300PD459 C01D08R-0024.tif
- 314: 0000MCAMP SUP CO 08276CP JOHNSON GA 4300PD459 C01D08R-0025.tif
- 315: 0000MPROV CO 11192CP JOHNSON GA 4300PD459 C01D08R-0026.tif
- 316: 0000NRETHENANS HOSP 03107BELFORT FRANCE E540PD459 C01D09L-0001.tif
- 317: 0000NBALLOON TROOPS 04140PONTANOZEN BKS E540PD459 C01D09L-0002.tif
- 318: 0000NBALLOON WING CO04143SAIZERAIS FRANCE E540PD459 C01D09L-0003.tif
- 319: 0000NBALLOON WING CO04144VILLE SUR COUSANCES FRANCE E540PD459 C01D09L-0004.tif
- 320: 0000NBALLOON WING CO04145FRANCE E540PD459 C01D09L-0005.tif
- 321: 0000NBALLOON WING CO04146FRANCE E540PD459 C01D09L-0006.tif
- 322: 0000NBALLOON WING CO04147FRANCE E540PD459 C01D09L-0007.tif
- 323: 0000NBALLOON WING CO04148FRANCE E540PD459 C01D09L-0008.tif
- 324: 0000NPROV AND CAS DT09320APO 762 FORWARDING CP PD459 C01D09L-0009.tif
- 325: 0000NOCT AUTO REPL 09202FRANCE DRAFT QMC DET E540PD459 C01D09L-0010.tif
- 326: 0000NJULY SEPT OCT 09203FRANCE AUTO REPL DRAFT E540PD459 C01D09L-0011.tif
- 327: 0000NCAS DET 09234FRANCE E540PD459 C01D09L-0012.tif
- 328: 0000NCASUAL CO HDQRS09260CP DE GRASSE FRANCE E540PD459 C01D09L-0013.tif
- 329: 0000MCP INFIRM 00224CP CURTISS GUILD MASS ++1300PD458 C01D09R-0014.tif
- 330: 0000MWENTWORTH INST 01158BOSTON MASS ++1306PD458 C01D09R-0015.tif
- 331: 0000MCHARLESTOWN 00097BOSTON MASS ARMORY ++1306PD458 C01D09R-0016.tif
- 332: 0000MDEPT AND ATTND 00098BOSTON MASS SURG ++1306PD458 C01D09R-0017.tif
- 333: 0000MCOMMONWEALTH 00099BOSTON MASS ++1306PD458 C01D09R-0018.tif
- 334: 0000MMOTOR TRANS COR00100BOSTON MASS ++1306PD458 C01D09R-0019.tif
- 335: 0000MFRANKLIN UNION 00361BOSTON MASS TRNG DET ++1306PD458 C01D09R-0020.tif
- 336: 0000MMASS INSTR OF 00743CAMBRIDGE MASS TECH SCH MIL AERO ++1310PD458 C01D09R-0021.tif
- 337: 0000MMASS INSTR OF 00744CAMBRIDGE MASS TECH S A T C ++1310PD458 C01D09R-0022.tif
- 338: 0000MHARVARD SATC 00493CAMBRIDGE MASS ++1310PD458 C01D09R-0023.tif
- 339: 0000MROTC 00142CAMBRIDGE MASS ++1310PD458 C01D09R-0024.tif
- 340: 0000MBASE HOSP 00254CP DEVENS MASS ++1328PD458 C01D09R-0025.tif
- 341: 0000MSTA HOSP 033851926+++++++JEFFERSON BKS MO ++7587PD458 C01D10L-0001.tif
- 342: 0000MSTA DISP 034681926+++++++ST LOUIS MO ++7587PD458 C01D10L-0002.tif
- 343: 0000MSTA HOSP 034431926+++++++FT ROBINSON NEB ++7600PD458 C01D10L-0003.tif
- 344: 0000MSTA HOSP 033521926+++++++FT CROOK NEB ++7628PD458 C01D10L-0004.tif
- 345: 0000MGEN DISP 034281926+++++++OMAHA NEB ++7681PD458 C01D10L-0005.tif
- 346: 0000MSTA HOSP 034291926+++++++FT OMAHA NEBR +7681PD458 C01D10L-0006.tif
- 347: 0000MSTA HOSP 034101926+++++++FT MEADE S D ++7800PD458 C01D10L-0007.tif
- 348: 0000MSTA HOSP 033561926+++++++FT DA RUSSEL WYO ++7900PD458 C01D10L-0008.tif
- 349: 0000MSTA HOSP 034401926+++++++FT RENO OKLA +8400PD458 C01D10L-0009.tif
- 350: 0000MSTA HOSP 033421926+++++++FT BROWN TEX ++8500PD458 C01D10L-0010.tif
- 351: 0000MSTA HOSP 060021937+++++++PRES OF MONTEREY CALIF ++9165PD458 C01D10R-0011.tif
- 352: 0000MSTA HOSP 060471937+++++++SAN FRANCISCO CALIF ++9166PD458 C01D10R-0012.tif
- 353: 0000MUS NAVAL HOSP 060461937+++++++SAN DIEGO CALIF ++9174PD458 C01D10R-0013.tif
- 354: 0000MGEN HOSP 059841937+++++++SAN FRANCISCO CALIF LETTERMAN ++9175PD458 C01D10R-0014.tif
- 355: 0000MFLD DISP 060621937+++++++STOCKTON CALIF ++9192PD458 C01D10R-0015.tif
- 356: 0000MSTA HOSP 060071937+++++++FT MISSOULA MONT ++9361PD458 C01D10R-0016.tif
- 357: 0000MSTA HOSP 059511937+++++++FT DOUGLAS UTAH ++9629PD458 C01D10R-0017.tif
- 358: 0000MSTA HOSP 059621937+++++++FT GEO WRIGHT WASH ++9700PD458 C01D10R-0018.tif
- 359: 0000MUS NAVAL HOSP 059281937+++++++FT BREMERTON WASH ++9708PD458 C01D10R-0019.tif
- 360: 0000MSTA HOSP 059821937+++++++FT LAWTON WASH ++9739PD458 C01D10R-0020.tif
- 361: 0000MSTA HOSP 059851937+++++++FT LEWIS WASH ++9742PD458 C01D10R-0021.tif
- 362: 0000MSTA HOSP 060811937+++++++FT WORDEN WASHINGTON ++9751PD458 C01D10R-0022.tif
- 363: 0000MSTA HOSP 060681937+++++++VANCOUVER BKS WASH ++9788PD458 C01D10R-0023.tif
- 364: 0000MSTA HOSP 059701937+++++++FT HUACHUCA ARIZ ++9800PD458 C01D10R-0024.tif
- 365: C01D10R-0025.tif
- 366: 0000MSTA HOSP 059361937+++++++CHILKOOT BKS ALAS ++C500PD458 C01D10R-0026.tif
- 367: 0000NSTA HOSP 061051937+++++++FT DAVIS C Z ++D220PD458 C01D10R-0027.tif
- 368: 0000NSTA HOSP 061041937+++++++FT RANDOLPH C Z ++D220PD458 C01D10R-0028.tif
- 369: ROTC-FT MCPHERSON GA 0000800934344 1082 C01D11L-0001.tif
- 370: ROTC-FT MCPHERSON 0000800924344 1081 C01D11L-0002.tif
- 371: 0000 FA DET FT MCPHERSON GA 0000800444344 1021 C01D11L-0003.tif
- 372: DET-WAR-PRIS-BKS FT MCP GA 0001701204344 0778 C01D11L-0004.tif
- 373: M-T-C-DET 0001500964344 FT MCPHERSON GA 0717 C01D11L-0005.tif
- 374: USA LAB FT MCPHERSON GA 0001900274344 1896 C01D11L-0006.tif
- 375: USA LAB FT MCPHERSON GA 0001900284344 1897 C01D11L-0007.tif
- 376: ORD DETCP BENNING GA 0001700564341 0652 C01D11L-0008.tif
- 377: RS-FT BENNING GA 0000901634341 2154 C01D11L-0009.tif
- 378: VET-DET-FORT BENNING GA 0000900764341 1992 C01D11L-0010.tif
- 379: COLORED IN CONF CP BENNING GA 0000901554341 2146 C01D11L-0011.tif
- 380: 0000-CCC FT BENNING GA 0001301564341 2174 C01D11L-0012.tif
- 381: 0000-FIN DEPT FT BENNING GA 0001301564341 2174 C01D11L-0013.tif
- 382: HQ ELLINGTON FLD TEX 0001501708543 0855 C01D11R-0014.tif
- 383: REC DET ELLINGTON FLD TEX 0001501708543 0855 C01D11R-0015.tif
- 384: FIN DET ELLINGTON FLD TEX 0001501708543 0855 C01D11R-0016.tif
- 385: QM-DET-DRYDEN TEX 0000601678541 1813 C01D11R-0017.tif
- 386: S+TC-BAPTIST COLLEGE 0000700908537 1289 C01D11R-0018.tif
- 387: QM DET LOVE FLD TEX 0000601728536 1818 C01D11R-0019.tif
- 388: 0000 RCTG SV GSI DALLAS TEX 0001301488536 2166 C01D11R-0020.tif
- 389: 0000 ROTC DALLAS TEXAS 0001001018536 1113 C01D11R-0021.tif
- 390: C01D11R-0022.tif
- 391: QM-DET-DALLAS TEX 0000601678536 1813 C01D11R-0023.tif
- 392: 0000 QM DET DALLAS TEX 0000500748536 1771 C01D11R-0024.tif
- 393: 0000 AUX REM DEP QMC DALLASTEX0000500718536 1768 C01D11R-0025.tif
- 394: 0000 AVN REP DEP DALLAS TEX 0000800858536 1074 C01D11R-0026.tif
- 395: QM-DET-CORPUS CHRISTI TEX 0000601678534 1813 C01D11R-0027.tif
- 396: POST NCS CORPUS CHRISTI TEX 0001501708534 0855 C01D11R-0028.tif
- 397: 0000 ROTC COLLEGE STA TEXAS 0001001018532 1113 C01D11R-0029.tif
-
- 1 2 3 4 5 6 7 8
- 12345678901234567890123456789012345678901234567890123456789012345678901234567890
-
-
-Column Spectra: Showing the characters found in each column:
-
-Example #1: 202 of the above cards have this format and spectrum:
-
- 188: 0032+CO+ 8+BN+151+DB+CP+DEVENS051060082- +SEE+ILLEG+FILE+++MASS- 0997 C01D05L-0014.tif
-
- : _ _________________________ _____________________________________
- +: + ++++++++++++++++++++++++ + ++ ++ +++
- -: - ----------- -- -------- - -- -- - -
- 0: 0000 0 00000000 0 0000
- 1: 111 1 11 11 1 11111 111 1 1 1 1 1 1 1111
- 2: 22 2 2 222 2 222 2 2 2222
- 3: 33 3 3 3 3 3 33 33 333
- 4: 44 4 4 4 444 44 444
- 5: 555 5 5 55 55 5 55 5 555
- 6: 666 6 66 66 66 6 66 6 666
- 7: 7 7 7 7 77 7777
- 8: 8 88 8 8 888 8 8 888
- 9: 99 9 99 9 9 9 999
- A: AAA AAAAAA AAA AAA AA A A AAA
- B: BBBB BBBBB BB BB B BB B B B B
- C: CCCCCC CCCCCCCCCCCCC C C C C C
- D: DDDDDDDDDD DD DD DD D DD D DDDDD D D
- E: EEEEEE EEEE EEEEEEEE EE EEEEE EEE EEEEE E E E
- F: F F F FF F FFF FFF F F
- G: G G GGGGG G G GG G G G G G GGG GG
- H: H H HHH H H H H H H H
- I: I I I IIII II I II II III III I I
- J: J J J
- K: K K K
- L: L LLLLLLLLL LLL LL L LLL LLLLL LLLL L LLL L
- M: MMMMMM M M M M M M M M MM
- N: NN NNNNN NNNN NN N NN N N N NN N N
- O: OOOOOOOOOOOOOO OOOOO O O O O O
- P: PPPP PPPP PPP P PP P P
- Q: QQ Q Q QQ QQ
- R: RRR RRRRR RRRRRRR RR RR R R R R RR R
- S: S S SSSSSSS SS SS S S SSS SS S S S SS
- T: TTTTTTTTTTT TTT TT TT T T T T T T
- U: U U U UU U U U U U
- V: VVV V V V V
- W: W W W W W
- X: X X X X X X X X X
- Y: Y Y Y Y Y
-
-Example #2: 72 of the above cards have this format and spectrum:
-
- 247: +GUARDHOUSE FT WAYNE MICH 26004007420956SEE+ILLEG+FILE- 0734 C01D06R-0032.tif
-
- : ______________________________ _________________________________
- +: + + + +
- -: ------- - - -
- 0: 0 0000 0000 0000 0000
- 1: 1 11 111 111 1 1111
- 2: 2 2 2222 222 2222
- 3: 3 3 333 333 33
- 4: 4 4 4 444 444 444
- 5: 5 5555555 555
- 6: 6 6 66 66 6 666
- 7: 77 7 7 77 7 7 777
- 8: 8 888 88 888
- 9: 9 99 99 999
- A: AAA AAAAAAAAAAAAAAAAAAAA A A A AAA A
- B: B B BB B B B
- C: C CCCCCCCCCCCCCCCCCCCC CCCCCC CC CCC C C
- D: D DDDDDDDDDDDDDDD DDD D D D
- E: EE EEEEEEEEEEEEEEEEEEEEEEEE E EEEE EE E E
- F: F F F F FFFFFFFFF FFF F F F F F F
- G: G GGG GGGG G GGGG GG G G G
- H: HH H H HHHHHHHHHHHHHH HHH HHH HH H H H
- I: II IIIIIIIIIIIIIIIIIIIIIIII I II I II
- J: J
- K: K K K
- L: LLLL LLLL LLLLLLLLL LL LL L
- M: MMM MMM M MMMM MMMMMM MMMMM M M M
- N: NN NNNNNNNNNNNNNNNNNNNN NN NNN NN NNN NNN
- O: OOOOOOO OOOOOOOOOOOOO OOOOO OOO OO O
- P: PPP P PPPPPPPPP PPP P PPPP P
- Q: QQ QQQ Q
- R: RRRRRRRRRRRRRRRRRRR RRRRR R R R R RR RR
- S: SSS SSSSSSSSSSSSSSSSSS S S S SS SS
- T: TTTTTTTTTTTTTTTTTTTTTTTT T T T TTT
- U: UU UU U U UUU UU U UUU U U
- V: V V VV VVV V V V V V V
- W: W W W WW
- X: X X XX X X
- Y: Y YYY Y Y YY Y
- Z: Z Z Z Z
-
-Example #3: 115 of the above cards have this format and spectrum:
-
- 354: 0000MGEN HOSP 059841937+++++++SAN FRANCISCO CALIF LETTERMAN ++9175PD458 C01D10R-0014.tif
-
- : _____________ __________________________________________________
- +: + ++ ++++ + +++++++ + ++++++
- -: - - - - -
- 0: 0000 00000 00
- 1: 1 111111 1 1 1111
- 2: 2 2 222 2 2 222
- 3: 3 3 3333 3 33
- 4: 4 4444 4 4444 4
- 5: 5 5555 5 555 5
- 6: 66 6666 6 6 666
- 7: 77 7777 77 7777
- 8: 8 8888 8888 8
- 9: 99 9999 9 9999 9
- A: AAA AAA AAA A AAA AAAAA AAAAAAAAAA AAAAAA AA A A
- B: B B BB BBB BB B B B B B BBBB B
- C: CCCCCCCC CCCCC C CCCC C CCCCC CCCCCCCCCCCCC C C
- D: D D DDDDD DD D DD D DD DD DD DDD D D D D
- E: EEEEEEEEEEEE EE EEEEEEEEEEEEEEE EEEEEE E E E E
- F: F F F FF F F F F FF FFF F F FFF F FF
- G: GGG G GGGGGG GG GG GG GGG GG GG GG G
- H: HHH HHHHHHHHH H H H HHH HH HHHHH HH
- I: I II II IIII II IIII I III I IIII I I
- J: JJ J J
- K: K K K K KK K K K KKK
- L: LLLLL LLLL L LL L LLLLLL LLL L L L
- M: MMMMM MMMMMM MM M MMMM MM M MMM MMM M M
- N: N NNNNNNN NNNNN NN NNNNNNNNN NNNNNNNNN NN N N
- O: OOOOOOOOO OOOOO OO OOOOO OOOOOOOOOOOOOOO O O O
- P: PPPP PPPPPPPPP PP P P P P PP PP P P P
- Q: Q QQ Q Q
- R: RRRRRRRR R R RR R RRRRRRRRRRRRRRRRRRRRRR R R R R
- S: SSSSSSSSSSSSSSS S S SSSSSSSSS SSSSSSSSS SS
- T: TTTTTTTTTTTTTTT T T T TT TTT TTTTTTTTTTT T T TT
- U: UU U UUU UU U U U UU UU UU U U
- V: V V V V VVV VV VV V
- W: W WWW WW W W WWW WW WW
- X: X X
- Y: Y YYY
- Z: Z Z Z ZZ
-
-Example #4: 8 of the above cards matched none of the formats defined above:
- 84: 0013+MACH+GUN+BN 368040129 ILLEG CO A DEC 1917 JAN FEB MAR 1¿/¿7 C01D02L-0010.tif
-
- ¿: ¿ ¿
- : ________________________________________________________________________________
- +: + + +
- /: /
- 0: 00 0 0000 0 00 0
- 1: 11 1 1 1 1 1 1 1 1
- 2: 2 2 22 2
- 3: 3 3 3 3
- 4: 4 4
- 5: 5 5
- 6: 6 6 6
- 7: 7 7 7 7 7
- 8: 8 8 8
- 9: 9 9
- A: A AA A A
- B: B B B
- C: C CCC C C C C C
- D: D D D D
- E: E E E E E E E
- F: F
- G: G G
- H: H H H
- I: I I I I I I
- J: J
- L: L L LL
- M: M M M M
- N: N N N N
- O: OO O O O O
- P: P PP P P
- Q: Q Q
- R: R R R R
- S: S S S S S
- T: TT T T T
- U: U U U
- V: V
- Y: Y
-
-
- |
-
-
-
-
-
- Processed 18-Jun-2015 for Noah Durham, National Archives and Records Administration (Customer #120200) by:
-
-
-Hollerith you need us! ;^)
-
PunchCardReader.com
-
-
-
-
-
diff --git a/images/not_punchcards/graph.png b/images/not_punchcards/graph.png
new file mode 100644
index 0000000..618fb9c
Binary files /dev/null and b/images/not_punchcards/graph.png differ
diff --git a/images/not_punchcards/graph2.png b/images/not_punchcards/graph2.png
new file mode 100644
index 0000000..ff350bb
Binary files /dev/null and b/images/not_punchcards/graph2.png differ
diff --git a/punchcards/__init__.py b/punchcards/__init__.py
index 192a944..02e6be7 100644
--- a/punchcards/__init__.py
+++ b/punchcards/__init__.py
@@ -1,2 +1,3 @@
from punchcards.punchcard import PunchCard
from punchcards.normalize import find_card
+from punchcards import cli
diff --git a/punchcards/cli.py b/punchcards/cli.py
index a4431f6..5dbdaac 100644
--- a/punchcards/cli.py
+++ b/punchcards/cli.py
@@ -1,8 +1,19 @@
from .punchcard import PunchCard
+from .normalize import find_card
+from PIL import Image
from docopt import docopt
+import logging
+
+__doc_opt__ = """Punchcard Command Line Interface.
+
+Usage:
+ punchcard ...
+ punchcard (-h | --help)
+ punchcard --version
+"""
if __name__ == '__main__':
- args = docopt(__doc__, version='Punch Card Reader 1.0')
+ args = docopt(__doc_opt__, version='Punch Card Reader 1.0')
logger = logging.getLogger('punchcard')
logger.setLevel(logging.WARN)
@@ -20,4 +31,4 @@
image = find_card(image)
image.show()
card = PunchCard(image, bright=127) # using neutral gray as threshold color
- return card.text
+ print(card.text)
diff --git a/punchcards/normalize.py b/punchcards/normalize.py
index 8d7dd97..7342971 100644
--- a/punchcards/normalize.py
+++ b/punchcards/normalize.py
@@ -17,6 +17,12 @@
import logging
from .punchcard import PunchCard
+CARD_WIDTH = 7.0 + 3.0/8.0 # Inches
+CARD_HEIGHT = 3.25 # Inches
+CARD_SPEC_TOLERANCE = .15 # inches, adjust as needed
+CARD_W_TO_H_RATIO_HIGH = (CARD_WIDTH + CARD_SPEC_TOLERANCE) / CARD_HEIGHT
+CARD_W_TO_H_RATIO_LOW = (CARD_WIDTH - CARD_SPEC_TOLERANCE) / CARD_HEIGHT
+
logger = logging.getLogger('punchcard')
def example():
@@ -33,22 +39,27 @@ def example():
print("Card Text:"+card.text)
# Identify the lightest corner and place it top-left
-def normalizeFlip(orig_img):
+def normalizeFlip(orig_img, cropped_img):
testbox = (0,0,20,20)
brightest = -1
- test_img = orig_img
- best_flip = test_img
+ test_img = cropped_img
+ best_flip = (0,0)
for (x,y), value in numpy.ndenumerate(numpy.zeros((2,2))):
if x:
- test_img = orig_img.transpose(Image.FLIP_LEFT_RIGHT)
+ test_img = cropped_img.transpose(Image.FLIP_LEFT_RIGHT)
if y:
test_img = test_img.transpose(Image.FLIP_TOP_BOTTOM)
# test_img.show()
b = brightness(test_img.crop(testbox))
if b > brightest:
brightest = b
- best_flip = test_img
- return best_flip
+ best_flip = (x,y)
+ result = orig_img
+ if best_flip[0]:
+ result = result.transpose(Image.FLIP_LEFT_RIGHT)
+ if best_flip[1]:
+ result = result.transpose(Image.FLIP_TOP_BOTTOM)
+ return result
def cropCard(im):
# crop along X axis
@@ -62,13 +73,12 @@ def cropCard(im):
top, bottom = findMargins(x_cropped, axis=1)
y_crop_box = (0, top, x_cropped.size[0]-1, bottom)
result = x_cropped.crop(y_crop_box)
- result.show()
return result
# Find the index values where dark region begins and ends
def findMargins(im, axis=0, threshold=.2):
pix = numpy.array(im)
- max = im.size[axis]*255
+ max = pix.shape[axis]*255
max = max - int(max*threshold)
vector = numpy.sum(pix, axis=axis)
first = 0
@@ -103,16 +113,41 @@ def brightness( im ):
stat = ImageStat.Stat(im)
return stat.mean[0]
+def combine_images( imgs ):
+ imgs = [i.convert(mode="RGB") for i in imgs]
+ max_width = sorted( [(i.size[0]) for i in imgs])[-1]
+ diagnostic = numpy.vstack( (numpy.asarray( i.resize( (max_width, i.size[1]*max_width/i.size[0])) ) for i in imgs ) )
+ return Image.fromarray( diagnostic, mode="RGB" )
+
+def is_card_dimensions(image):
+ card_ratio = float(image.size[0]) / float(image.size[1])
+ print(str(card_ratio))
+ print(str(CARD_W_TO_H_RATIO_HIGH) + " to " + str(CARD_W_TO_H_RATIO_LOW))
+ return card_ratio <= CARD_W_TO_H_RATIO_HIGH and card_ratio > CARD_W_TO_H_RATIO_LOW
+
def find_card(image):
- image = image.convert(mode="L")
- if(isnotbacklit(image)):
- image = ImageOps.invert(image)
- image = cropCard(image)
+ image2 = image.convert(mode="L")
+ diag = combine_images([image, image2])
+ image3 = image2
+ if(isnotbacklit(image2)):
+ image3 = ImageOps.invert(image2)
+ diag = combine_images([diag, image3])
+ cropped = cropCard(image3)
+ diag = combine_images([diag, cropped])
#image.show()
- if(image.size[1] > image.size[0]):
- image = image.transpose(Image.ROTATE_90)
- image = normalizeFlip(image)
- return image
+ image4 = image3
+ if(cropped.size[1] > cropped.size[0]):
+ print('rotate 90')
+ image4 = image3.transpose(Image.ROTATE_90)
+ cropped = cropped.transpose(Image.ROTATE_90)
+ if not is_card_dimensions(cropped):
+ return None
+ diag = combine_images([diag, image4])
+ image5 = normalizeFlip(image4, cropped)
+ diag = combine_images([diag, image5])
+ if logger.isEnabledFor(logging.DEBUG):
+ diag.show()
+ return image5
if __name__ == '__main__':
example()
diff --git a/punchcards/punchcard.py b/punchcards/punchcard.py
index f76607e..4c43315 100755
--- a/punchcards/punchcard.py
+++ b/punchcards/punchcard.py
@@ -15,6 +15,8 @@ class PunchCard(object):
logger = logging.getLogger('punchcard')
+ SPEC_IBM_MODEL_029 = "IBM Model 029 Punch Card" # only one for now
+
CARD_COLUMNS = 80
CARD_ROWS = 12
@@ -70,7 +72,7 @@ def create_card_map(self):
self.translate[tuple(v[1:])] = v[0]
# generate a range of floats
- def drange(start, stop, step=1.0):
+ def drange(self, start, stop, step=1.0):
r = start
while (step >= 0.0 and r < stop) or (step < 0.0 and r > stop):
yield r
@@ -82,7 +84,6 @@ def __init__(self, image, bright=-1, debug=False, xstart=0, xstop=0, ystart=0, y
self.text = ''
self.decoded = []
self.surface = []
- self.debug = debug
self.threshold = 0
self.ymin = ystart
self.ymax = ystop
@@ -92,6 +93,10 @@ def __init__(self, image, bright=-1, debug=False, xstart=0, xstop=0, ystart=0, y
self.image = image
self.pix = image.load()
self._crop()
+ if debug:
+ self.logger.setLevel(logging.DEBUG)
+ else:
+ self.logger.setLevel(logging.WARN)
self._scan(bright)
# Brightness is the average of RGB values
@@ -111,8 +116,8 @@ def _crop(self):
self.xmax = self.xsize
if self.ymax == 0:
self.ymax = self.ysize
- self.midx = int(self.xmin + (self.xmax - self.xmin) / 2 + self.xadjust)
- self.midy = int(self.ymin + (self.ymax - self.ymin) / 2)
+ self.midx = self.xmin + (self.xmax - self.xmin) / 2 + self.xadjust
+ self.midy = self.ymin + (self.ymax - self.ymin) / 2
# heuristic for finding a reasonable cutoff brightness
def _find_threshold_brightness(self):
@@ -173,9 +178,9 @@ def _find_data_horiz_dimensions(self, probe_y):
col_width = width * self.CARD_COL_WIDTH_RATIO
hole_width = width * self.CARD_HOLE_WIDTH_RATIO
#print col_width
- if self.debug:
+ if self.logger.isEnabledFor(logging.DEBUG):
# mark left and right edges on the copy
- for y in range(int(probe_y) - int(self.ysize/100), int(probe_y) + int(self.ysize/100)):
+ for y in range(int(probe_y - self.ysize/100), int(probe_y + self.ysize/100)):
self.debug_pix[left_border if left_border > 0 else 0,y] = 255
self.debug_pix[right_border if right_border < self.xmax else self.xmax - 1,y] = 255
for x in range(1, int((self.xmax - self.xmin) / 200)):
@@ -203,14 +208,14 @@ def _find_data_vert_dimensions(self):
hole_height = int(card_height * self.CARD_HOLE_HEIGHT_RATIO)
data_top_y = data_begins + hole_height / 2
col_height = int(card_height * self.CARD_ROW_HEIGHT_RATIO)
- if self.debug:
+ if self.logger.isEnabledFor(logging.DEBUG):
# mark up the copy with the edges
for x in range(self.xmin, self.xmax-1):
self.debug_pix[x,top_border] = 255
self.debug_pix[x,bottom_border] = 255
- if self.debug:
+ if self.logger.isEnabledFor(logging.DEBUG):
# mark search parameters
- for x in range(self.midx - int(self.xsize/20), self.midx + int(self.xsize/20)):
+ for x in range(self.midx - self.xsize/20, self.midx + self.xsize/20):
self.debug_pix[x,self.ymin] = 255
self.debug_pix[x,self.ymax - 1] = 255
for y in range(0, self.ymin):
@@ -220,7 +225,7 @@ def _find_data_vert_dimensions(self):
return data_top_y, data_top_y + col_height * 11, col_height, hole_height
def _scan(self, bright=-1):
- if self.debug:
+ if self.logger.isEnabledFor(logging.DEBUG):
# if debugging make a copy we can draw on
self.debug_image = self.image.copy()
self.debug_pix = self.debug_image.load()
@@ -243,7 +248,7 @@ def _scan(self, bright=-1):
if val >= self.threshold:
if left_edge == -1:
left_edge = x
- if self.debug:
+ if self.logger.isEnabledFor(logging.DEBUG):
self.debug_pix[x,y] = self._flip(self.pix[x,y])
else:
if left_edge > -1:
@@ -252,22 +257,22 @@ def _scan(self, bright=-1):
col_num = int((left_edge + hole_length / 2.0 - x_data_left) / col_width + 0.25)
data[(col_num, row_num)] = hole_length
left_edge = -1
- if (self.debug):
+ if self.logger.isEnabledFor(logging.DEBUG):
# Plot where holes might be on this row
expected_top_edge = y - hole_height / 2
expected_bottom_edge = y + hole_height / 2
blue = 255 * 256 * 256
- for expected_left_edge in drange(x_data_left, x_data_right - 1, col_width):
- for y_plot in drange(expected_top_edge, expected_bottom_edge, 2):
+ for expected_left_edge in self.drange(x_data_left, x_data_right - 1, col_width):
+ for y_plot in self.drange(expected_top_edge, expected_bottom_edge, 2):
self.debug_pix[expected_left_edge,y_plot] = blue
#self.debug_pix[x + hole_width/2,yline] = 255 * 256 * 256
self.debug_pix[expected_left_edge + hole_width,y_plot] = blue
- for x_plot in drange(expected_left_edge, expected_left_edge + hole_width):
+ for x_plot in self.drange(expected_left_edge, expected_left_edge + hole_width):
self.debug_pix[x_plot, expected_top_edge] = blue
self.debug_pix[x_plot, expected_bottom_edge] = blue
y += col_height
- if self.debug:
+ if self.logger.isEnabledFor(logging.DEBUG):
self.debug_image.show()
# prevent run-a-way debug shows causing my desktop to run out of memory
raw_input("Press Enter to continue...")
diff --git a/tests/test_punchcards.py b/tests/test_punchcards.py
index 032f569..7af0b2a 100644
--- a/tests/test_punchcards.py
+++ b/tests/test_punchcards.py
@@ -1,7 +1,30 @@
+from PIL import Image
+from punchcards.normalize import find_card
+from punchcards.punchcard import PunchCard
+from os import listdir
+from os.path import isfile, join
+
+def testcard( filepath ):
+ print(filepath)
+ im = Image.open(filepath)
+ im = find_card(im)
+ if im is not None:
+ card = PunchCard(im, bright=127, debug=False)
+ print(card.text)
+ else:
+ print('Not a punchcard.')
+
+def test_cards():
+ card_images = [f for f in listdir('images/') if isfile(join('images/', f))]
+ for name in card_images:
+ testcard(join('images/', name))
+
+def test_noncards():
+ non_card_images = [f for f in listdir('images/not_punchcards/') if isfile(join('images/not_punchcards/', f))]
+ for name in non_card_images:
+ testcard(join('images/not_punchcards/', name))
def test_examples():
- from PIL import Image
- from punchcards import read_card
files = [
'images/C04D01L-0001.tif',
'images/C04D01L-0001-90.tif',
@@ -17,3 +40,7 @@ def test_examples():
image = Image.open(file)
image.show()
assert result == text
+
+if __name__ == "__main__":
+ test_cards()
+ test_noncards()