質問
私はこの留守に質問ですが、私のグループに参加"ボタンをもうべきである。
何が最良の方法をインポートするCSVファイルを、強く型のデータ構造ですか?再プ=ります。
解決
チェック FileHelpersオープンソースの図書館.
他のヒント
Microsoftの TextFieldParser は安定であると認識しており RFC4180 のためのCSVファイルです。配布とアップグレードが行われ、 Microsoft.VisualBasic
名前空間;この標準のコンポーネント.NETフレームワーク、追加のグローバル Microsoft.VisualBasic
ます。
だ作成のためのWindows(モノ)となること構文"壊れた"非RFCに準拠した)CSVファイル、そしてこのことは当然の選択では無料、無制限の安定した、支援にも積極的に取り組みは、できないと言われるのFileHelpers.
参照: 方法:からの読み込みにカンマ区切りテキストファイルをVisual Basic のためのVBコード例です。
使用OleDB接続します。
String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\InputDirectory\\;Extended Properties='text;HDR=Yes;FMT=Delimited'";
OleDbConnection objConn = new OleDbConnection(sConnectionString);
objConn.Open();
DataTable dt = new DataTable();
OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM file.csv", objConn);
OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
objAdapter1.SelectCommand = objCmdSelect;
objAdapter1.Fill(dt);
objConn.Close();
い期待をかなり複雑なシナリオをCSV解析、 なものと考えら圧延独自のパーサ.多くの優れたツールであり、 FileHelpers, ももから CodeProject.
そのポイントはこれはかなり共通の問題だわりのベット 多く ソフトウェアの開発者が既に考え、この問題は解決した。
Brianを与えても解決に変換する強く型付けされます。
のCSV解析手法を与えない考慮脱分野または一部をその他の機微をCSVファイルのようにトリミングます。こちらのコードを個人的に利用します。奥高尾にひっそりと建つ料亭。荒エッジの周りにはほとんどないエラー報告といいます。
public static IList<IList<string>> Parse(string content)
{
IList<IList<string>> records = new List<IList<string>>();
StringReader stringReader = new StringReader(content);
bool inQoutedString = false;
IList<string> record = new List<string>();
StringBuilder fieldBuilder = new StringBuilder();
while (stringReader.Peek() != -1)
{
char readChar = (char)stringReader.Read();
if (readChar == '\n' || (readChar == '\r' && stringReader.Peek() == '\n'))
{
// If it's a \r\n combo consume the \n part and throw it away.
if (readChar == '\r')
{
stringReader.Read();
}
if (inQoutedString)
{
if (readChar == '\r')
{
fieldBuilder.Append('\r');
}
fieldBuilder.Append('\n');
}
else
{
record.Add(fieldBuilder.ToString().TrimEnd());
fieldBuilder = new StringBuilder();
records.Add(record);
record = new List<string>();
inQoutedString = false;
}
}
else if (fieldBuilder.Length == 0 && !inQoutedString)
{
if (char.IsWhiteSpace(readChar))
{
// Ignore leading whitespace
}
else if (readChar == '"')
{
inQoutedString = true;
}
else if (readChar == ',')
{
record.Add(fieldBuilder.ToString().TrimEnd());
fieldBuilder = new StringBuilder();
}
else
{
fieldBuilder.Append(readChar);
}
}
else if (readChar == ',')
{
if (inQoutedString)
{
fieldBuilder.Append(',');
}
else
{
record.Add(fieldBuilder.ToString().TrimEnd());
fieldBuilder = new StringBuilder();
}
}
else if (readChar == '"')
{
if (inQoutedString)
{
if (stringReader.Peek() == '"')
{
stringReader.Read();
fieldBuilder.Append('"');
}
else
{
inQoutedString = false;
}
}
else
{
fieldBuilder.Append(readChar);
}
}
else
{
fieldBuilder.Append(readChar);
}
}
record.Add(fieldBuilder.ToString().TrimEnd());
records.Add(record);
return records;
}
こんの場合のない区切りをダブルクォートがmeerleyを引用した文字列することが重要です。見 このポスト メンバーが、より良いexpanationなどへのリンクも正します。
い@NotMyself. FileHelpers どを試験して取り扱うすべての種類の端る場合だけこまれています。取FileHelpersは、書くだけで自分だんだことは(1)という処理の必要の場合FileHelpersは、(2)またこのようなものをする時はとても嬉しい気持ちでいっぱい構文解析もこのように:
1日の"請求書","Smith","総括"、"No Comment"
2,'Drake,','O'Malley',"管理人,
メん引用として新しい。
ったので退屈してしまったん変更があったたものを書く。かみの封止に構文解析にOO的にwhle量の削減の繰り返しにファイルでのみを繰り返して調べてを一度にforeach.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// usage:
// note this wont run as getting streams is not Implemented
// but will get you started
CSVFileParser fileParser = new CSVFileParser();
// TO Do: configure fileparser
PersonParser personParser = new PersonParser(fileParser);
List<Person> persons = new List<Person>();
// if the file is large and there is a good way to limit
// without having to reparse the whole file you can use a
// linq query if you desire
foreach (Person person in personParser.GetPersons())
{
persons.Add(person);
}
// now we have a list of Person objects
}
}
public abstract class CSVParser
{
protected String[] deliniators = { "," };
protected internal IEnumerable<String[]> GetRecords()
{
Stream stream = GetStream();
StreamReader reader = new StreamReader(stream);
String[] aRecord;
while (!reader.EndOfStream)
{
aRecord = reader.ReadLine().Split(deliniators,
StringSplitOptions.None);
yield return aRecord;
}
}
protected abstract Stream GetStream();
}
public class CSVFileParser : CSVParser
{
// to do: add logic to get a stream from a file
protected override Stream GetStream()
{
throw new NotImplementedException();
}
}
public class CSVWebParser : CSVParser
{
// to do: add logic to get a stream from a web request
protected override Stream GetStream()
{
throw new NotImplementedException();
}
}
public class Person
{
public String Name { get; set; }
public String Address { get; set; }
public DateTime DOB { get; set; }
}
public class PersonParser
{
public PersonParser(CSVParser parser)
{
this.Parser = parser;
}
public CSVParser Parser { get; set; }
public IEnumerable<Person> GetPersons()
{
foreach (String[] record in this.Parser.GetRecords())
{
yield return new Person()
{
Name = record[0],
Address = record[1],
DOB = DateTime.Parse(record[2]),
};
}
}
}
}
あの記事CodeProjectを提供するコードのようなソリューションは、その利用 StreamReader るこ 輸入CSVデータ を使用 Microsoftテキストドライバー.
良いプについて教えてくださいがオープンファイルを読み込むための各行には、"配列"リンクリスト、データ構造体、お客さまに選択です。取り扱いには十分注意する第一線になってる。
この場合、ものがあるようで直接アクセスして利用 接続文字列.
してみませんPythonであり、C#とVB?それは素晴らしいCSVモジュールの輸入とはすべて、重いものを持ち上げます。
利用いただCSVのパーサです。ネットプロジェクトこの夏、Microsoft Jetテキストドライバーです。指定したフォルダを接続文字列、そしてクエリファイルを使用SQLを選択します。を指定できる強い型スキーマ.iniファイルです。思いがしたくなんとかなると考えているタイプのデータかすぐには見当たらなど、IP番号やエントリのように"XYQ3.9SP1".
一つの制限またはそのお取扱いできないカラム名以上64文字;でtruncates.こんな問題を除き、取り扱った良設計される必要があります。を返しますADO.NET データセットである。
このた最適解を見つけた。私は障害を起こす場合があり、自分のCSVパーサからという部分の終了の場合、いからその他の無料CSV解析パッケージです。純があります。
編集:また、できないかなschema.iniファイルにディレクトリで動的に追加したいという強いタイプの列あります。まだ強いタイプの列を指定し、推定のための他不特定の分野です。あることを取り扱った輸入の流体の70+CSVカラムとかを指定したいそれぞれの列のマナー違反です。
I型の一部のコードです。の結果をdatagridviewerた。でを解析し、単一の行のテキストへのarraylistのオブジェクト。
enum quotestatus
{
none,
firstquote,
secondquote
}
public static System.Collections.ArrayList Parse(string line,string delimiter)
{
System.Collections.ArrayList ar = new System.Collections.ArrayList();
StringBuilder field = new StringBuilder();
quotestatus status = quotestatus.none;
foreach (char ch in line.ToCharArray())
{
string chOmsch = "char";
if (ch == Convert.ToChar(delimiter))
{
if (status== quotestatus.firstquote)
{
chOmsch = "char";
}
else
{
chOmsch = "delimiter";
}
}
if (ch == Convert.ToChar(34))
{
chOmsch = "quotes";
if (status == quotestatus.firstquote)
{
status = quotestatus.secondquote;
}
if (status == quotestatus.none )
{
status = quotestatus.firstquote;
}
}
switch (chOmsch)
{
case "char":
field.Append(ch);
break;
case "delimiter":
ar.Add(field.ToString());
field.Clear();
break;
case "quotes":
if (status==quotestatus.firstquote)
{
field.Clear();
}
if (status== quotestatus.secondquote)
{
status =quotestatus.none;
}
break;
}
}
if (field.Length != 0)
{
ar.Add(field.ToString());
}
return ar;
}
できる保証がないことは次のとおりでのデータは、その最も簡単な方法がされてはいかがでしょうかを使用 文字列になります。分割.
例えば:
String[] values = myString.Split(',');
myObject.StringField = values[0];
myObject.IntField = Int32.Parse(values[1]);
ある図書館を使用できる、そう簡単にできます。だけでできる状態にする必要がありますね次のとおりでのデータを、それ以外が必要となりますのです。