From: Keith Packard Date: Wed, 12 Feb 2025 06:46:47 +0000 (-0800) Subject: Sort tab-separated output files by refdes as primary key X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=c11868e5bf6b41c3ee25918d96a6b0d78fb6bc4e;p=hw%2Faltusmetrum Sort tab-separated output files by refdes as primary key Signed-off-by: Keith Packard --- diff --git a/bin/parts.py b/bin/parts.py index 84d83c1..5d3ce8c 100644 --- a/bin/parts.py +++ b/bin/parts.py @@ -40,6 +40,7 @@ pref_order_tab = ('refdes', 'device', 'value', 'footprint', 'loadstatus', 'provi 'mfg_part_number', 'vendor', 'vendor_part_number', 'quantity') value_pattern=r'([0-9]+)(\.[0-9]*)?([kmMupng]?)(F|H|Hz|V|screws)?([ _][0-9]+(\.[0-9]*))?' +refdes_pattern=r'([a-zA-Z]+)([0-9]+)' class Part(): """ @@ -239,8 +240,8 @@ class Parts(): t = t + (i,) return t - # Compute a key value suitable for sorting - def cmp_key(self, k): + # Compute a key value suitable for sorting CSV output files + def cmp_csv_key(self, k): value = k[1] m = re.fullmatch(value_pattern, value, flags=re.IGNORECASE) if m: @@ -266,12 +267,52 @@ class Parts(): n = 0 return (k[0], value, n, k[2]) + # Compute a key value suitable for sorting tab output files + def cmp_tab_key(self, k): + part = self.get(k) + refdes = 'unknown' + if part is not None: + refdes = part.get_unknown('refdes') + + mr = re.fullmatch(refdes_pattern, refdes) + if mr: + category = mr.group(1) + r = int(mr.group(2)) + else: + category = "~" + r = refdes + + value = k[1] + m = re.fullmatch(value_pattern, value, flags=re.IGNORECASE) + if m: + number = m.group(1) + if m.group(2): + number += m.group(2) + n = float(number) + scale = m.group(3) + if scale == 'G': + n *= 1000000000 + elif scale == 'M': + n *= 1000000 + elif scale == 'k': + n *= 1000 + elif scale == 'm': + n /= 1000 + elif scale == 'u' or scale == 'µ': + n /= 1000000 + elif scale == 'p': + n /= 1000000000 + value = "" + else: + n = 0 + return (category, r, k[0], value, n, k[2]) + # Export to a CSV file object def export_csv_file(self, outfile): csvwriter = csv.writer(outfile, dialect='excel-nl') attrs = self.attrs_tuple(pref_order_csv) csvwriter.writerow(attrs) - keys = sorted(list(self.parts), key=self.cmp_key) + keys = sorted(list(self.parts), key=self.cmp_csv_key) for key in keys: part = self.get(key) csvwriter.writerow(tuple(map(part.get_unknown, attrs))) @@ -285,7 +326,7 @@ class Parts(): def export_tab_file(self, outfile): attrs = self.attrs_tuple(pref_order_tab) print("\t".join(attrs), file=outfile) - keys = sorted(list(self.parts), key=self.cmp_key) + keys = sorted(list(self.parts), key=self.cmp_tab_key) for key in keys: part = self.get(key) print("\t".join(tuple(map(part.get_unknown, attrs))), file=outfile)