tdulik

Graphs - CSV to Graphviz (for dot.exe)

Nov 23rd, 2020
727
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package graphCSV2dot;
  2.  
  3. import java.util.*;
  4. import java.io.*;
  5.  
  6. class Road {
  7.     int cityId;
  8.     double lenght;
  9.  
  10.     public Road(int cityId, double lenght) {
  11.         this.cityId = cityId;
  12.         this.lenght = lenght;
  13.     }
  14. }
  15.  
  16. class City {
  17.     int id;
  18.     String name;
  19.     LinkedList<Road> roads;
  20.     HashMap<Integer, Double> roadId2Len;
  21.  
  22.     public City(int id, String name) {
  23.         this.id = id;
  24.         this.name = name;
  25.         roads = new LinkedList<Road>();
  26.         roadId2Len = new HashMap<>();
  27.     }
  28.  
  29.     public void addRoad(int cityId, double len) {
  30.         roads.add(new Road(cityId, len));
  31.         roadId2Len.put(cityId, len);
  32.     }
  33. }
  34.  
  35. public class Main {
  36.  
  37.     public static void main(String[] args) {
  38.         String fileName="map.csv", dotExe="c:/Programs/graphviz-2.38/bin/dot.exe";
  39.         if (args.length<1) {
  40.             System.err.println("Missing argument #1 - input file name. Trying "+fileName);
  41.         } else fileName=args[0];
  42.         if (args.length<2) {
  43.             System.err.println("Missing argument #2 - dot.exe (full path). Trying "+dotExe);
  44.         } else dotExe=args[1];
  45.  
  46.         System.err.println("Reading input CSV from: "+fileName);
  47.         Scanner s;
  48.         HashMap<Integer, City> citiesMap = new HashMap<>();
  49.         LinkedList<City> cities = new LinkedList<>();
  50.         try {
  51.             s = new Scanner(new File(fileName), "utf-8");
  52.             String outputFileName=fileName+".gv";
  53.             PrintWriter f = new PrintWriter(outputFileName, "utf-8");
  54.             f.print("strict digraph graphname {\n"
  55. //                  + " concentrate=true\n"
  56.                     + " label=\"Generated at " + new Date().toString() + "\"\n" + " overlap=false\n"
  57. //                  + " ratio=compress\n"
  58. //                  + " splines=true\n"
  59.                     + " layout=sfdp\n"
  60. //                  + " esep = -0.4\n"
  61. //                  + " graph [pad=\"0.1\", nodesep=\"0.2\", ranksep=\"1\"];"
  62.                     + " charset=\"UTF-8\"\n");
  63.             while (s.hasNext()) {
  64.                 String line = s.nextLine();
  65.                 String fields[] = line.split(";");
  66.                 if (fields.length >= 2) {
  67.                     int cityId = Integer.parseInt(fields[0]);
  68.                     City c = new City(cityId, fields[1]);
  69.                     f.printf("  %d [label=\"%s\"]\n", cityId, fields[1] + "\\nID=" + cityId);
  70.                     int i;
  71.                     for (i = 2; i < fields.length; i += 2) {
  72.                         int cid = Integer.parseInt(fields[i + 1]);
  73.                         double len = Double.parseDouble(fields[i]);
  74.                         if (len == 0)
  75.                             break;
  76.                         c.addRoad(cid, len);
  77.                     }
  78.                     System.out.printf("Adding city: %s (id=%d) with %d roads.\n", c.name, c.id, i/2);
  79.                     cities.add(c);
  80.                     citiesMap.put(c.id, c);
  81.                 }
  82.             }
  83.             s.close();
  84.             for (City c : cities) {
  85.                 for (Road r : c.roads) {
  86.                     City dstCity = citiesMap.get(r.cityId);
  87.                     if (dstCity == null)
  88.                         System.err.printf("Destination city %d of road from %s with %d km does not exist\n", r.cityId,
  89.                                 c.name, r.lenght);
  90.                     else {
  91.                         // check the road back:
  92.                         Double lenBack = dstCity.roadId2Len.get(c.id);
  93.                         // if road back has different length, print the edge:
  94.                         if (lenBack == null || lenBack != null && r.lenght != lenBack) {
  95.                             System.err.printf("Asymetric road between city ID %d and %d\n", c.id, dstCity.id);
  96.                             f.printf("  %d -> %d [label=\"%.0f km\"];\n", c.id, r.cityId, r.lenght);
  97.                         } else if (c.id < dstCity.id) { // print the current road only once:
  98.                             f.printf("  %d -> %d [label=\"%.0f km\" dir=both]\n", c.id, r.cityId, r.lenght);
  99.                         }
  100.                     }
  101.                 }
  102.             }
  103.             f.printf("}\n");
  104.             f.close();
  105.             Runtime.getRuntime().exec(dotExe + " -O -Tsvg "+outputFileName);
  106.             System.out.println("OK, successfuly generated "+outputFileName+" and "+outputFileName+".svg!");
  107.         } catch (Exception e) {
  108.             // TODO Auto-generated catch block
  109.             e.printStackTrace();
  110.         }
  111.     }
  112.  
  113. }
  114.  
RAW Paste Data