diff --git a/src/main/java/com/android/tools/r8/DexSegments.java b/src/main/java/com/android/tools/r8/DexSegments.java
index b726171..b009e9d 100644
--- a/src/main/java/com/android/tools/r8/DexSegments.java
+++ b/src/main/java/com/android/tools/r8/DexSegments.java
@@ -22,21 +22,30 @@
 public class DexSegments {
   public static class Command extends BaseCommand {
 
+    private final boolean csv;
+
     public static class Builder
         extends BaseCommand.Builder<Command, Builder> {
 
+      private boolean csv = false;
+
       @Override
       Command.Builder self() {
         return this;
       }
 
+      private Builder setCsv(boolean csv) {
+        this.csv = csv;
+        return self();
+      }
+
       @Override
       protected Command makeCommand() {
         // If printing versions ignore everything else.
         if (isPrintHelp()) {
           return new Command(isPrintHelp());
         }
-        return new Command(getAppBuilder().build());
+        return new Command(getAppBuilder().build(), csv);
       }
     }
 
@@ -63,6 +72,8 @@
           continue;
         } else if (arg.equals("--help")) {
           builder.setPrintHelp(true);
+        } else if (arg.equals("--csv")) {
+          builder.setCsv(true);
         } else {
           if (arg.startsWith("--")) {
             builder.getReporter().error(new StringDiagnostic("Unknown option: " + arg,
@@ -73,12 +84,14 @@
       }
     }
 
-    private Command(AndroidApp inputApp) {
+    private Command(AndroidApp inputApp, boolean csv) {
       super(inputApp);
+      this.csv = csv;
     }
 
     private Command(boolean printHelp) {
       super(printHelp, false);
+      this.csv = false;
     }
 
     @Override
@@ -90,24 +103,41 @@
   public static void main(String[] args)
       throws IOException, CompilationFailedException, ResourceException {
     Command.Builder builder = Command.parse(args);
-    Map<Integer, SegmentInfo> result = run(builder.build());
+    Command cmd = builder.build();
+    Map<Integer, SegmentInfo> result = run(cmd);
     if (result == null) {
       return;
     }
-    System.out.println("Segments in dex application (name: size / items):");
-    // This output is parsed by tools/test_framework.py. Check the parsing there when updating.
-    result.forEach(
-        (key, value) -> {
-          System.out.print(
-              " - " + DexSection.typeName(key) + ": " + value.size + " / " + value.items);
-          if (key == Constants.TYPE_TYPE_LIST) {
-            // Type items header is just a uint, and each element is a ushort. see
-            // https://source.android.com/devices/tech/dalvik/dex-format#type-list.
-            int typeItemsSize = (value.size - value.items * 4);
-            System.out.print(" (TypeItems: " + typeItemsSize + " / " + (typeItemsSize / 2) + ")");
-          }
-          System.out.println();
-        });
+    if (cmd.csv) {
+      System.out.println("\"Name\",\"Size\",\"Items\"");
+      result.forEach(
+          (key, value) -> {
+            System.out.println(
+                "\"" + DexSection.typeName(key) + "\", " + value.size + ", " + value.items);
+            if (key == Constants.TYPE_TYPE_LIST) {
+              // Type items header is just a uint, and each element is a ushort. see
+              // https://source.android.com/devices/tech/dalvik/dex-format#type-list.
+              int typeItemsSize = (value.size - value.items * 4);
+              System.out.println(
+                  "\"TypeItems\", " + typeItemsSize + ", " + (typeItemsSize / 2) + "");
+            }
+          });
+    } else {
+      System.out.println("Segments in dex application (name: size / items):");
+      // This output is parsed by tools/test_framework.py. Check the parsing there when updating.
+      result.forEach(
+          (key, value) -> {
+            System.out.print(
+                " - " + DexSection.typeName(key) + ": " + value.size + " / " + value.items);
+            if (key == Constants.TYPE_TYPE_LIST) {
+              // Type items header is just a uint, and each element is a ushort. see
+              // https://source.android.com/devices/tech/dalvik/dex-format#type-list.
+              int typeItemsSize = (value.size - value.items * 4);
+              System.out.print(" (TypeItems: " + typeItemsSize + " / " + (typeItemsSize / 2) + ")");
+            }
+            System.out.println();
+          });
+    }
   }
 
   public static Map<Integer, SegmentInfo> run(Command command)
