ファイルからデータを読み取る必要があります。ファイルのデータはカンマまたはタブで区切って指定する必要があります。私は今すぐgetcsv関数があるが、それは1つの可能な区切り文字しか受け入れない。コンマまたはタブで区切られたテキストファイルからの読み取り
これを処理する方法はありますか?
ありがとうございました。
ファイルからデータを読み取る必要があります。ファイルのデータはカンマまたはタブで区切って指定する必要があります。私は今すぐgetcsv関数があるが、それは1つの可能な区切り文字しか受け入れない。コンマまたはタブで区切られたテキストファイルからの読み取り
これを処理する方法はありますか?
ありがとうございました。
PHP 5.3からは、str_getcsv()を使用して、異なる区切り文字を使用して行を読み取ることができます。
$someCondition = someConditionToDetermineTabOrComma();
$delimiter = $someCondition ? "," : "\t";
$fp = fopen('mydata.csv', 'r');
while (!feof($fp))
{
$line = fgets($fp, 2048);
$data = str_getcsv($line, $delimiter);
doSomethingWithData($data);
}
fclose($fp);
ファイル全体を1行ずつ読み込み、分割して分割します。
任意の区切り文字を含む正規表現を含めることができます。私は文をテストするためにここにPHPはありませんでしたが、split()のphp.net - >検索。 また正規表現に関するコメントもあります。
しかし、その方法は、おそらくCSVファイルのすべてが、最も簡単なの目的を破り、getcsvのエンクロージャの機能を排除するであろう。 – dimo414
あなたはあなたがfgetcsvの区切り文字を指定することができexplode
explode (string $delimiter , string $string [, int $limit ]);
を試すことができます()。これは、タブ区切りのファイルを読み込むの一例であり、
ここwhile (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) {
...
}
はい、でもCSVファイルにすることができます。問題は、それがcsvか、または削除されたタブかどうかを確認する方法です。 – veli
はここmydata.txt
CSVフィールド
$tab = "\t";
$fp = fopen('mydata.txt', 'r');
while (!feof($fp))
{
$line = fgets($fp, 2048);
$data_txt = str_getcsv($line, $tab);
//Get First Line of Data over here
print_r($data_txt);
exit;
}
fclose($fp);
これは素晴らしいものです。 –
を読み込みます例です。私は将来の使用のための私のユーティリティライブラリに追加された機能です。私はNSSec's answerから派生しました。
このソリューションでは、アレイのキーとして最初の行を使用するかどうかを指定できます。おそらく、ある場所で$ first_line_keysパラメータのキーに使用する配列を渡す機能を追加することになります。
/**
* Converts a CSV file into an array
* NOTE: file does NOT have to have .csv extension
*
* $file - path to file to convert (string)
* $delimiter - field delimiter (string)
* $first_line_keys - use first line as array keys (bool)
* $line_lenght - set length to retrieve for each line (int)
*/
public static function CSVToArray($file, $delimiter = ',', $first_line_keys = true, $line_length = 2048){
// file doesn't exist
if(!file_exists($file)){
return false;
}
// open file
$fp = fopen($file, 'r');
// add each line to array
$csv_array = array();
while(!feof($fp)){
// get current line
$line = fgets($fp, $line_length);
// line to array
$data = str_getcsv($line, $delimiter);
// keys/data count mismatch
if(isset($keys) && count($keys) != count($data)){
// skip to next line
continue;
// first line, first line should be keys
}else if($first_line_keys && !isset($keys)){
// use line data for keys
$keys = $data;
// first line used as keys
}else if($first_line_keys){
// add as associative array
$csv_array[] = array_combine($keys, $data);
// first line NOT used for keys
}else{
// add as numeric array
$csv_array[] = $data;
}
}
// close file
fclose($fp);
// nothing found
if(!$csv_array){
return array();
}
// return csv array
return $csv_array;
} // CSVToArray()
$filePath = "somefile.txt";
$delimiter = "\t";
$file = new \SplFileObject($filePath);
while (!$file->eof()) {
$line = $file->fgetcsv($delimiter);
print_r($line);
}
あなたの答えにいくつかの説明を追加して、他のユーザーにとってより価値のあるものにしてください。 – wmk
私は似たような解決策になった。私はファイルを読んで、その中のタブを検索する。もし見つからなければ、デリミタはコンマであると仮定します。次に、getscvをPHPのバージョンが5.2であるとして使用します。私はこれにいくつかの欠陥を見ていますが、私は何か良いことは考えられません。 – veli
おそらく、最初の行でタブとコンマ(および他の可能性のある区切り文字)を数え、2番目の行と比較するなどです。どちらが最も一貫しているかは、可能性の高い区切り文字です。残念ながら、2つのパスの解決方法がありますが、それはあなたがそのような不明な点を持つときの方法です。 – Rikki