Math.NET Numerics
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

223 lines
14 KiB

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Delimited Text Files (CSV &amp; TSV)
</title>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="author" content="Christoph Ruegg, Marcus Cuda, Jurgen Van Gael">
<link rel="stylesheet" id="theme_link" href="https://cdnjs.cloudflare.com/ajax/libs/bootswatch/4.6.0/materia/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-Piv4xVNRyMGpqkS2by6br4gNJ7DXjqk09RmUpJ8jgGtD7zP9yug3goQfGII0yAns" crossorigin="anonymous"></script>
<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-MML-AM_CHTML"></script>
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<link type="text/css" rel="stylesheet" href="https://numerics.mathdotnet.com/content/navbar-fixed-left.css" />
<link type="text/css" rel="stylesheet" href="https://numerics.mathdotnet.com/content/fsdocs-default.css" />
<link type="text/css" rel="stylesheet" href="https://numerics.mathdotnet.com/content/fsdocs-custom.css" />
<script type="text/javascript" src="https://numerics.mathdotnet.com/content/fsdocs-tips.js"></script>
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!-- BEGIN SEARCH BOX: this adds support for the search box -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/JavaScript-autoComplete/1.0.4/auto-complete.css" />
<!-- END SEARCH BOX: this adds support for the search box -->
</head>
<body>
<nav class="navbar navbar-expand-md navbar-light bg-secondary fixed-left" id="fsdocs-nav">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse navbar-nav-scroll" id="navbarsExampleDefault">
<a href="https://numerics.mathdotnet.com/"><img id="fsdocs-logo" src="/logo.png" /></a>
<!-- BEGIN SEARCH BOX: this adds support for the search box -->
<div id="header">
<div class="searchbox" id="fsdocs-searchbox">
<label for="search-by">
<i class="fas fa-search"></i>
</label>
<input data-search-input="" id="search-by" type="search" placeholder="Search..." />
<span data-search-clear="">
<i class="fas fa-times"></i>
</span>
</div>
</div>
<!-- END SEARCH BOX: this adds support for the search box -->
<ul class="navbar-nav">
<li class="nav-header">Math.NET Numerics</li>
<li class="nav-item"><a class="nav-link" href="Packages.html">NuGet & Binaries</a></li>
<li class="nav-item"><a class="nav-link" href="ReleaseNotes.html">Release Notes</a></li>
<li class="nav-item"><a class="nav-link" href="https://github.com/mathnet/mathnet-numerics/blob/master/LICENSE.md">MIT License</a></li>
<li class="nav-item"><a class="nav-link" href="Compatibility.html">Platform Support</a></li>
<li class="nav-item"><a class="nav-link" href="https://numerics.mathdotnet.com/api/">Class Reference</a></li>
<li class="nav-item"><a class="nav-link" href="https://github.com/mathnet/mathnet-numerics/issues">Issues & Bugs</a></li>
<li class="nav-item"><a class="nav-link" href="Users.html">Who is using Math.NET?</a></li>
<li class="nav-header">Contributing</li>
<li class="nav-item"><a class="nav-link" href="Contributors.html">Contributors</a></li>
<li class="nav-item"><a class="nav-link" href="Contributing.html">Contributing</a></li>
<li class="nav-item"><a class="nav-link" href="Build.html">Build & Tools</a></li>
<li class="nav-item"><a class="nav-link" href="https://github.com/mathnet/mathnet-numerics/discussions/categories/ideas">Your Ideas</a></li>
<li class="nav-header">Getting Help</li>
<li class="nav-item"><a class="nav-link" href="https://discuss.mathdotnet.com/c/numerics">Discuss</a></li>
<li class="nav-item"><a class="nav-link" href="https://stackoverflow.com/questions/tagged/mathdotnet">Stack Overflow</a></li>
<li class="nav-header">Getting Started</li>
<l class="nav-item"i><a class="nav-link" href="/">Getting started</a></li>
<li class="nav-item"><a class="nav-link" href="Constants.html">Constants</a></li>
<li class="nav-item"><a class="nav-link" href="Matrix.html">Matrices and Vectors</a></li>
<li class="nav-item"><a class="nav-link" href="Euclid.html">Euclid & Number Theory</a></li>
<li class="nav-item">Combinatorics</li>
<li class="nav-header">Evaluation</li>
<li class="nav-item"><a class="nav-link" href="Functions.html">Special Functions</a></li>
<li class="nav-item"><a class="nav-link" href="Integration.html">Integration</a></li>
<li class="nav-header">Statistics/Probability</li>
<li class="nav-item"><a class="nav-link" href="DescriptiveStatistics.html">Descriptive Statistics</a></li>
<li class="nav-item"><a class="nav-link" href="Probability.html">Probability Distributions</a></li>
<li class="nav-header">Generation</li>
<li class="nav-item"><a class="nav-link" href="Generate.html">Generating Data</a></li>
<li class="nav-item"><a class="nav-link" href="Random.html">Random Numbers</a></li>
<li class="nav-header">Solving Equations</li>
<li class="nav-item"><a class="nav-link" href="LinearEquations.html">Linear Equation Systems</a></li>
<li class="nav-header">Optimization</li>
<li class="nav-item"><a class="nav-link" href="Distance.html">Distance Metrics</a></li>
<li class="nav-header">Curve Fitting</li>
<li class="nav-item"><a class="nav-link" href="Regression.html">Regression</a></li>
<li class="nav-header">Native Providers</li>
<li class="nav-item"><a class="nav-link" href="MKL.html">Intel MKL</a></li>
<li class="nav-header">Working Together</li>
<li class="nav-item"><a class="nav-link" href="CSV.html">Delimited Text Files (CSV)</a></li>
<li class="nav-item"><a class="nav-link" href="MatrixMarket.html">NIST MatrixMarket</a></li>
<li class="nav-item"><a class="nav-link" href="MatlabFiles.html">MATLAB</a></li>
<li class="nav-item"><a class="nav-link" href="IFSharpNotebook.html">IF# Notebook</a></li>
</ul>
</div>
</nav>
<div class="container">
<div class="masthead">
<h3 class="muted">
<a href="https://numerics.mathdotnet.com">Math.NET Numerics</a> |
<a href="https://www.mathdotnet.com">Math.NET Project</a> |
<a href="https://github.com/mathnet/mathnet-numerics">GitHub</a>
</h3>
</div>
<hr />
<div class="container" id="fsdocs-content">
<h1><a name="Delimited-Text-Files-CSV-amp-TSV" class="anchor" href="#Delimited-Text-Files-CSV-amp-TSV">Delimited Text Files (CSV &amp; TSV)</a></h1>
<p>Likely the most common file format for tabular data, delimited files like CSV store data as text
with one line per row and values within rows separated by a comma.
Such text files are supported by virtually all software that deals with tabular data.</p>
<p>Example:</p>
<table class="pre"><tr><td class="snippet"><pre class="fssnip"><code lang="text">A,B,C
0.5,0.6,98.0
2.0,3.4,5.3
</code></pre></td></tr></table>
<p>Unfortunately there is no universal standard on what character is used as separator and how
individual values are formatted and escaped. CSV files traditionally use a comma as separator, but this
causes problems e.g. in Germany where the comma is used as decimal point in numbers. The tabulator
proves to be a useful alternative, usually denoted by using the TSV extension instead of CSV.
Other separators like semicolons or colons are common as well.</p>
<p>Math.NET Numerics provides basic support for delimited files with the <strong>MathNet.Numerics.Data.Text</strong> package,
which is available on NuGet as separate package and not included in the basic distribution.</p>
<h2><a name="Reading-a-matrix-from-a-delimited-file" class="anchor" href="#Reading-a-matrix-from-a-delimited-file">Reading a matrix from a delimited file</a></h2>
<p>The <code>DelimitedReader</code> class provides static functions to read a matrix from a file or string in delimited form.
It can read from:</p>
<ul>
<li>
<strong>TextReader</strong>: If you have your delimited data already in memory in a string,
you can use this method using a StringReader.
</li>
<li><strong>Stream</strong>: read directly from a stream, e.g. a MemoryStream, FileStream or NetworkStream.</li>
<li><strong>File Path (string)</strong>: read from a file, specified by the file system path.</li>
</ul>
<p>All these functions expect the data type of the matrix to be generated as generic type argument.
Only Double, Single, Complex and Complex32 are supported.</p>
<p>Example:</p>
<table class="pre"><tr><td class="snippet"><pre class="fssnip highlighted"><code lang="csharp"><span class="k">using</span> MathNet.Numerics.Data.Text;
Matrix&lt;<span class="k">double</span>&gt; matrix <span class="o">=</span> DelimitedReader.Read&lt;<span class="k">double</span>&gt;(<span class="s">"data.csv"</span>, <span class="k">false</span>, <span class="s">","</span>, <span class="k">true</span>);
</code></pre></td></tr></table>
<p>Unfortunately the lack of standard means that the parsing logic needs to be parametrized accordingly.
There are ways to automatically profile the provided file to find out the correct parameters automatically,
but for simplicity the Read functions expects those parameters explicitly as optional arguments:</p>
<ul>
<li>
<strong>sparse</strong>: Whether the the returned matrix should be constructed as sparse (true) or dense (false).<br />
Default: false.
</li>
<li>
<strong>delimiter</strong>: Number delimiter between numbers of the same line. Supports Regex groups.<br />
Default: <code>\s</code> (white space).
</li>
<li>
<strong>hasHeaders</strong>: Whether the first row contains column headers or not. If true, the first line will be skipped.<br />
Default: false.
</li>
<li>
<strong>formatProvider</strong>: The culture to use. It is often a good idea to use InvariantCulture,
to make the format independent from the local culture.
Default: null.
</li>
</ul>
<h2><a name="Writing-a-matrix-to-a-delimited-file" class="anchor" href="#Writing-a-matrix-to-a-delimited-file">Writing a matrix to a delimited file</a></h2>
<p>The dual to the reader above is the <code>DelimitedWriter</code> class that can serialize a matrix
to a delimited text file, stream or TextWriter.</p>
<p>The static Write functions accept the following optional arguments to control the output format:</p>
<ul>
<li>
<strong>delimiter</strong>: Number delimiter to write between numbers of the same line.<br />
Default: <code>\t</code> (tabulator).
</li>
<li>
<strong>columnHeaders</strong>: list of column header strings, or null if no headers should be written.<br />
Default: null.
</li>
<li>
<strong>format</strong>: The number format to use on each element, similar to what can be provided to Double.ToString().<br />
Default: null.
</li>
<li>
<strong>formatProvider</strong>: The culture to use. It is often a good idea to use InvariantCulture,
to make the format independent from the local culture.
Default: null.
</li>
</ul>
<p>Example:</p>
<table class="pre"><tr><td class="snippet"><pre class="fssnip highlighted"><code lang="csharp">DelimitedWriter.Write(<span class="s">"data.csv"</span>, matrix, <span class="s">","</span>);
</code></pre></td></tr></table>
<h2><a name="Alternatives" class="anchor" href="#Alternatives">Alternatives</a></h2>
<p>The data extension packages also offer other ways to serialize a matrix to a binary stream or file.
Among others:</p>
<ul>
<li><a href="MatrixMarket.html">NIST MatrixMarket text files</a></li>
<li><a href="MatlabFiles.html">MATLAB Level-5 Mat files</a></li>
</ul>
</div>
<!-- BEGIN SEARCH BOX: this adds support for the search box -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/JavaScript-autoComplete/1.0.4/auto-complete.css" />
<script type="text/javascript">var fsdocs_search_baseurl = 'https://numerics.mathdotnet.com/';</script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/lunr.js/2.3.8/lunr.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/JavaScript-autoComplete/1.0.4/auto-complete.min.js"></script>
<script type="text/javascript" src="https://numerics.mathdotnet.com/content/fsdocs-search.js"></script>
<!-- END SEARCH BOX: this adds support for the search box -->
</div>
</body>
</html>