CSV Viewer to be refactored
using System; | |
using System.Collections; | |
using System.Collections.Generic; | |
using System.IO; | |
using System.Linq; | |
using System.Text; | |
using System.Threading.Tasks; | |
// Sample data: https://www.census.gov/econ/cbp/download/index.htm | |
namespace CSVViewer | |
{ | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
var rawLines = File.ReadAllLines(args[0]); | |
var pageLen = 5; | |
if (args.Length > 1) pageLen = int.Parse(args[1]); | |
var pageLines = rawLines.Take(pageLen + 1); | |
var iFirstLineOfLastPage = 1; | |
while (true) | |
{ | |
var records = pageLines.Select(l => Convert_line_to_record_fields(l, ",")); | |
var colWidths = Enumerable.Range(0, records.First().Count()) | |
.Select(i => records.Select(r => r[i].Length).Max()) | |
.ToArray(); | |
var headline = Create_disply_line_for_record(records.First(), colWidths); | |
var underlineRecord = Enumerable.Range(0, colWidths.Length).Select(i => new string('-', colWidths[i])); | |
var underline = string.Join("+", underlineRecord); | |
var displayLines = new[] {headline, underline}.Concat(records.Where((r,i) => i>0).Select(r => Create_disply_line_for_record(r, colWidths))); | |
Console.WriteLine(string.Join("\n", displayLines)); | |
Console.Write("F(irst, L(ast, N(ext, P(rev, eX(it: "); | |
var cmd = char.ToLower(Console.ReadKey().KeyChar); | |
Console.WriteLine("\n"); | |
switch (cmd) | |
{ | |
case 'x': | |
return; | |
case 'f': | |
pageLines = rawLines.Take(pageLen + 1); | |
iFirstLineOfLastPage = 1; | |
break; | |
case 'l': | |
iFirstLineOfLastPage = rawLines.Length - (rawLines.Length - 1)%pageLen; | |
pageLines = new[] {rawLines[0]}.Concat(rawLines.Where((l,i) => i>0 && i>=iFirstLineOfLastPage)); | |
break; | |
case 'n': | |
iFirstLineOfLastPage += pageLen; | |
if (iFirstLineOfLastPage >= rawLines.Length) | |
iFirstLineOfLastPage = rawLines.Length - (rawLines.Length - 1) % pageLen; | |
pageLines = new[] {rawLines[0]}.Concat(rawLines.Where((l, i) => i > 0 && i >= iFirstLineOfLastPage && i < (iFirstLineOfLastPage+pageLen))); | |
break; | |
case 'p': | |
iFirstLineOfLastPage -= pageLen; | |
if (iFirstLineOfLastPage < 1) | |
iFirstLineOfLastPage = 1; | |
pageLines = new[] {rawLines[0]}.Concat(rawLines.Where((l, i) => i > 0 && i >= iFirstLineOfLastPage && i < (iFirstLineOfLastPage+pageLen))); | |
break; | |
} | |
} | |
} | |
private static string[] Convert_line_to_record_fields(string line, string delimiter) | |
{ | |
return Convert_line_to_record_fields(line, delimiter, new List<string>()).ToArray(); | |
} | |
private static List<string> Convert_line_to_record_fields(string line, string delimiter, List<string> fields) | |
{ | |
if (line == "") return fields; | |
if (line.StartsWith("\"")) | |
{ | |
line = line.Substring(1); | |
var iApo = line.IndexOf("\""); | |
fields.Add(line.Substring(0, iApo).Trim()); | |
line = line.Substring(iApo + 1); | |
var iDelim = line.IndexOf(delimiter); | |
if (iDelim >= 0) | |
line = line.Substring(iDelim + 1); | |
else | |
line = ""; | |
} | |
else | |
{ | |
var iDelim = line.IndexOf(delimiter); | |
if (iDelim >= 0) | |
{ | |
fields.Add(line.Substring(0, iDelim).Trim()); | |
line = line.Substring(iDelim + 1); | |
} | |
else | |
{ | |
fields.Add(line.Trim()); | |
line = ""; | |
} | |
} | |
return Convert_line_to_record_fields(line, delimiter, fields); | |
} | |
private static string Create_disply_line_for_record(string[] recordFields, int[] colWidths) | |
{ | |
return string.Join("|", recordFields.Select((f, i) => f.PadRight(colWidths[i]))); | |
} | |
} | |
} |
zip | name | empflag | emp_nf | emp | qp1_nf | qp1 | ap_nf | ap | est | city | stabbr | cty_name | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00501 | HOLTSVILLE, NY | A | D | 0 | D | 0 | D | 0 | 2 | HOLTSVILLE | NY | SUFFOLK | |
01001 | AGAWAM, MA | G | 8788 | G | 75093 | G | 322008 | 436 | AGAWAM | MA | HAMPDEN | ||
01002 | AMHERST, MA | G | 15878 | G | 84225 | G | 360685 | 558 | AMHERST | MA | HAMPSHIRE | ||
01003 | AMHERST, MA | G | 198 | H | 2054 | H | 8591 | 16 | AMHERST | MA | HAMPSHIRE | ||
01004 | AMHERST, MA | C | S | 0 | H | 1578 | H | 7063 | 19 | AMHERST | MA | HAMPSHIRE | |
01005 | BARRE, MA | G | 751 | G | 5778 | G | 24826 | 91 | BARRE | MA | WORCESTER | ||
01007 | BELCHERTOWN, MA | G | 1749 | G | 10290 | G | 46766 | 217 | BELCHERTOWN | MA | HAMPSHIRE | ||
01008 | BLANDFORD, MA | H | 321 | H | 712 | G | 2810 | 20 | BLANDFORD | MA | HAMPDEN | ||
01009 | BONDSVILLE, MA | H | 119 | G | 1309 | G | 5161 | 14 | BONDSVILLE | MA | HAMPDEN | ||
01010 | BRIMFIELD, MA | G | 363 | G | 2871 | G | 12272 | 79 | BRIMFIELD | MA | HAMPDEN | ||
01011 | CHESTER, MA | G | 39 | G | 268 | G | 1234 | 16 | CHESTER | MA | HAMPDEN | ||
01012 | CHESTERFIELD, MA | G | 80 | G | 437 | G | 2213 | 13 | CHESTERFIELD | MA | HAMPSHIRE | ||
01013 | CHICOPEE, MA | G | 4788 | G | 41967 | G | 180975 | 323 | CHICOPEE | MA | HAMPDEN | ||
01014 | CHICOPEE, MA | A | S | 0 | G | 86 | G | 309 | 3 | CHICOPEE | MA | HAMPDEN | |
01020 | CHICOPEE, MA | G | 7375 | G | 58695 | G | 254591 | 529 | CHICOPEE | MA | HAMPDEN | ||
01021 | CHICOPEE, MA | G | 190 | G | 1248 | G | 5988 | 7 | CHICOPEE | MA | HAMPDEN | ||
01022 | CHICOPEE, MA | G | 2697 | G | 29380 | G | 118865 | 64 | CHICOPEE | MA | HAMPDEN | ||
01026 | CUMMINGTON, MA | H | 123 | H | 834 | H | 4050 | 17 | CUMMINGTON | MA | HAMPSHIRE | ||
01027 | EASTHAMPTON, MA | G | 4016 | G | 32228 | G | 136381 | 368 | EASTHAMPTON | MA | HAMPSHIRE | ||
01028 | EAST LONGMEADOW, MA | G | 7617 | G | 75222 | G | 309052 | 504 | EAST LONGMEADOW | MA | HAMPDEN | ||
01029 | EAST OTIS, MA | H | 135 | H | 793 | H | 4353 | 12 | EAST OTIS | MA | BERKSHIRE | ||
01030 | FEEDING HILLS, MA | G | 966 | G | 5454 | G | 27750 | 183 | FEEDING HILLS | MA | HAMPDEN | ||
01031 | GILBERTVILLE, MA | G | 72 | H | 328 | G | 1475 | 18 | GILBERTVILLE | MA | WORCESTER | ||
01032 | GOSHEN, MA | G | 98 | G | 752 | G | 3392 | 22 | GOSHEN | MA | HAMPSHIRE | ||
01033 | GRANBY, MA | H | 558 | G | 3665 | G | 18444 | 118 | GRANBY | MA | HAMPSHIRE | ||
01034 | GRANVILLE, MA | G | 75 | G | 637 | G | 3481 | 29 | GRANVILLE | MA | HAMPDEN | ||
01035 | HADLEY, MA | G | 4542 | G | 29564 | G | 127318 | 285 | HADLEY | MA | HAMPSHIRE | ||
01036 | HAMPDEN, MA | G | 621 | G | 4206 | G | 25094 | 117 | HAMPDEN | MA | HAMPDEN | ||
01037 | HARDWICK, MA | C | D | 0 | D | 0 | D | 0 | 13 | HARDWICK | MA | WORCESTER | |
01038 | HATFIELD, MA | G | 1662 | H | 16863 | H | 71542 | 57 | HATFIELD | MA | HAMPSHIRE | ||
01039 | HAYDENVILLE, MA | H | 252 | H | 2009 | H | 8324 | 35 | HAYDENVILLE | MA | HAMPSHIRE | ||
01040 | HOLYOKE, MA | G | 16955 | G | 153350 | G | 625975 | 903 | HOLYOKE | MA | HAMPDEN | ||
01041 | HOLYOKE, MA | G | 843 | G | 5443 | G | 23392 | 29 | HOLYOKE | MA | HAMPDEN | ||
01050 | HUNTINGTON, MA | G | 151 | G | 778 | G | 3540 | 26 | HUNTINGTON | MA | HAMPSHIRE | ||
01053 | LEEDS, MA | H | 1268 | H | 14705 | H | 56995 | 31 | LEEDS | MA | HAMPSHIRE | ||
01054 | LEVERETT, MA | G | 106 | G | 735 | G | 3522 | 33 | LEVERETT | MA | FRANKLIN | ||
01056 | LUDLOW, MA | G | 3776 | G | 33443 | G | 160007 | 403 | LUDLOW | MA | HAMPDEN | ||
01057 | MONSON, MA | G | 823 | G | 7125 | G | 31719 | 148 | MONSON | MA | HAMPDEN | ||
01059 | NORTH AMHERST, MA | G | 106 | H | 865 | H | 3795 | 13 | NORTH AMHERST | MA | HAMPSHIRE |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment