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:
-
-

Card Reader Service for 80-Column IBM Punch Cards

-

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()