- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试编写一个 php 脚本来处理 m3u 文件的每一行并将其写入相应的小时文件。每当流程开始时,我们总是在午夜 00 点或凌晨 12 点开始。从第一行到 END-OF-HOUR 这行的所有内容都进入文件 $month$day-$hour.58.15.m3u
$month 和 $day 在整个过程中保持不变并成功完成。我遇到问题的地方是当我点击 END-OF-HOUR 行时。假设发生的是脚本将 $hour 从 00 切换为 01。前面的 0 对于 0-9 小时非常重要。一旦发生切换,它将从文件中的下一行开始写入 hour 01 文件,直到它再次到达 END-OF-HOUR 行。小时值(value)再次增加。
这需要全天 24 小时持续。
发生的事情是此脚本将主文件全部复制到小时 00 文件中。
这是我自己能够做的:
<?php
//$location="";
$file="PLAYLIST";
$month="Nov";
$day="28";
$hour="00";
$outputlocation="Processed";
$outputfile="$month$day-$hour.58.15";
//Create Playlist Files Code Here and Working//
$handle = fopen("$file.m3u", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
// process the line read.
//Begin Processing
//If End Of Hour
if ($line=="END-OF-HOUR"){
//If Not 11PM
if ($hour !=="23"){
$hour="$hour" + 1;
}
//If 11PM
if ($hour =="24"){
echo "<script>alert('MusicMaster File Processing Complete')</script>";
}
}
//If Not End Of Hour
if ($line !="END-OF-HOUR"){
$ofile=file_get_contents("$outputlocation\\$outputfile.m3u");
$nfile="$ofile
$line";
file_put_contents("$outputlocation\\$outputfile.m3u", "$nfile");
}
}
fclose($handle);
} else {
// error opening the file.
echo "<script>alert('Error Opening MusicMaster File')</script>";
}
//https://stackoverflow.com/questions/13246597/how-to-read-a-file-line-by-line-in-php
?>
我不太精通 php 中的循环。只是非常基本的 if 语句和 mysql 查询。
这是它每小时从中提取并输出的文件。这只是一个片段:
M:\JINGLES\TOH\LEGAL ID 20170416-A.mp3
M:\ITUNES\Music\Danny Gokey\Rise (Album)\02 If You Ain't In It.mp3
M:\ITUNES\Music\MercyMe\MercyMe, It's Christmas\06 Have a Holly Jolly Christmas.mp3
M:\JINGLES\STANDARD\Stay Tuned.mp3
M:\ITUNES\Music\Royal Tailor\Royal Tailor\06 Ready Set Go.mp3
M:\ITUNES\Music\Third Day\Revelation\03 Call My Name.mp3
M:\THE STORY BEHIND IT\Mandisa - Bleed The Same (Song Story).mp3
M:\PROMOTIONS\Valley Park Flea Market & Resale (6PM 5-29).mp3
M:\PROMOTIONS\FoundationLyrics_com.mp3
M:\PROMOTIONS\VinVlogger_com (5-15-17).mp3
END-OF-HOUR
M:\JINGLES\TOH\LEGAL ID 20170816.mp3
M:\ITUNES\Music\Audio Adrenaline\Kings & Queens\02 Kings & Queens.mp3
M:\ITUNES\Music\Stars Go Dim\Stars Go Dim\01 Doxology.mp3
M:\JINGLES\STANDARD\LIN\LIN-002.mp3
M:\ITUNES\Music\NewSong\Newsong\Christian.mp3
M:\ITUNES\Music\David Dunn\Crystal Clear - EP\02 Have Everything.m4a
M:\THE STORY BEHIND IT\Mandisa - Bleed The Same (Song Story).mp3
M:\PROMOTIONS\Valley Park Flea Market & Resale (6PM 5-29).mp3
END-OF-HOUR
我知道我做错了什么,只是似乎无法弄清楚它是什么。非常感谢您提供的任何帮助。
最佳答案
我将从改变这个开始。
$outputfile="$month$day-$hour.58.15";
这需要在 while
循环迭代时更新(或者至少在您更改小时时)
现在,您一直都在使用为小时 00
设置的初始值。
这就是为什么你会得到它不改变小时的行为,因为它的值永远不会在循环运行时重新分配。
更新
我冒昧地重写了您的代码。不好意思我是个完美主义者,越看越不喜欢。 (没有测试,因为我没有任何文件)
$file="PLAYLIST";
//Use an array, it's more concise and readable
$date =[
'month' => "Nov",
'day' => 28,
'hour' => 0,
'minute' => 58, //added for extendability
'second' => 15 //added for extendability
];
$outputlocation="Processed";
/*** Create Playlist Files Code Here and Working ***/
//open file. We can't proceed without the file, might as well stop here if we can't open it.
if(false === ($handle = fopen("$file.m3u", "r"))) die("Failed to open file.");
//while each line in the file
while (($line = fgets($handle)) !== false) {
if(trim(strtoupper($line)) =="END-OF-HOUR"){//If $line = End Of Hour
//trim removes whitespace from front and back, strtoupper should be self explanitory
if($hour < 24 ){
//if less the 12pm (and $line = 'END-OF-HOUR' )
//increment hour and left pad.
//you may need to use < 23 your logic forgot about it.
++$date['hour'];
}else{
//else if 12pm (and $line = 'END-OF-HOUR' )
echo "<script>alert('MusicMaster File Processing Complete')</script>";
}
continue;
/*
goes to next line ( iteration of the loop )
none of the code below this runs.
logically this is essentially what you had ^
so there is no need to continue
*/
}
// 0 pad left any parts that are len of 1 lenght
$fixed = array_map(function($i){
return (strlen($i) == 1) ? "0$i":$i;
}, $date);
/*
create the filename just before we use it
not that it matter in PHP, but the original array stays as INT's
the month is strlen() = 3, so it's unchanged by the above.
*/
$outputfile = $fixed['month'].$fixed['day'].'-'.$fixed['hour'].'.'.$fixed['minute'].'.'.$fixed['second'];
//this is all you..
$ofile=file_get_contents("$outputlocation\\$outputfile.m3u");
$nfile="$ofile
$line";
file_put_contents("$outputlocation\\$outputfile.m3u", "$nfile");
} //end while
我用这个测试了一些东西:
$date =[
'month' => "Nov",
'day' => 28,
'hour' => 0,
'minute' => 58, //added for extendability
'second' => 15 //added for extendability
];
$fixed = array_map(function($i){
return (strlen($i) == 1) ? "0$i":$i;
}, $date);
$outputfile = $fixed['month'].$fixed['day'].'-'.$fixed['hour'].'.'.$fixed['minute'].'.'.$fixed['second'];
print_r($fixed);
echo "\n$outputfile\n";
输出
Array
(
[month] => Nov
[day] => 28
[hour] => 00
[minute] => 58
[second] => 15
)
Nov28-00.58.15
你可以在这个sandbox中试试
更新
如果你不想修剪所有的线,那么就把这个分开
while (($line = fgets($handle)) !== false) {
if(trim(strtoupper($line)) =="END-OF-HOUR"){//If $line = End Of Hour
像这样
while (($line = fgets($handle)) !== false) {
$line = trim($line);
if(strtoupper($line) =="END-OF-HOUR"){//If $line = End Of Hour
关于 trim 的一些其他事情,
trim('**foo**', '*');//输出'foo'
OR
并替换每个字符,而不考虑顺序,例如 trim('abcFOOcba', 'abc');//输出'FOO'
rtrim(' Foo '); 修剪右侧//输出 'Foo'
或使用 ltrim('Foo'); 修剪左边//输出'Foo'
我不知道为什么他们有 3 个独立的函数,我更喜欢这个 trim($string, $match, $flag);
其中 flag 是 TRIM_RIGH
, TRIM_LEFT
, TRIM_BOTH
但是,我猜你不能得到你想要的一切。 (类似于 MySql 版本)
通过使用 array_map
$a = [ 'Foo ', ' Bar '];
$a = array_map('trim', $a);
print_r($a); //outputs ['Foo', 'Bar']
PHP Trim 的文档
MySQL 也作为一个 TRIM()
函数 SELECT TRIM(BOTH ' ' FROM column) AS foo
它们非常有用。
Mysql Trim 的文档
关于php - 如何在 php 中到达特定行后写入新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47544891/
我想知道有没有可能做 new PrintWriter(new BufferedWriter(new PrintWriter(s.getOutputStream, true))) 在 Java 中,s
我正在尝试使用 ConcurrentHashMap 初始化 ConcurrentHashMap private final ConcurrentHashMap > myMulitiConcurrent
我只是想知道两个不同的新对象初始化器之间是否有任何区别,还是仅仅是语法糖。 因此: Dim _StreamReader as New Streamreader(mystream) 与以下内容不同: D
在 C++ 中,以下两种动态对象创建之间的确切区别是什么: A* pA = new A; A* pA = new A(); 我做了一些测试,但似乎在这两种情况下,都调用了默认构造函数,并且只调用了它。
我已经阅读了其他帖子,但它们没有解决我的问题。环境为VB 2008(2.0 Framework)下面的代码在 xslt.Load 行导致 XSLT 编译错误下面是错误的输出。我将 XSLT 作为字符串
我想知道为什么alert(new Boolean(false))打印 false 而不是打印对象,因为 new Boolean 应该返回对象。如果我使用 console.log(new Boolean
本文实例讲述了Python装饰器用法。分享给大家供大家参考,具体如下: 写装饰器 装饰器只不过是一种函数,接收被装饰的可调用对象作为它的唯一参数,然后返回一个可调用对象(就像前面的简单例子) 注
我可以编写 YAML header 来使用 knit 为 R Markdown 文件生成多种输出格式吗?我无法重现 the original question with this title 的答案中
我可以编写一个YAML标头以使用knitr为R Markdown文件生成多种输出格式吗?我无法重现the original question with this title答案中描述的功能。 这个降价
我正在使用vars package可视化脉冲响应。示例: library(vars) Canada % names ir % `$`(irf) %>% `[[`(variables[e])) %>%
我有一个容器类,它有一个通用参数,该参数被限制到某个基类。提供给泛型的类型是基类约束的子类。子类使用方法隐藏(新)来更改基类方法的行为(不,我不能将其设为虚拟,因为它不是我的代码)。我的问题是"new
Java 在提示! cannot find symbol symbol : constructor Bar() location: class Bar JPanel panel =
在我的应用程序中,一个新的 Activity 从触摸按钮(而不是点击)开始,而且我没有抬起手指并希望在新的 Activity 中跟踪触摸的 Action 。第二个 Activity 中的触摸监听器不响
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,
和我的last question ,我的程序无法检测到一个短语并将其与第一行以外的任何行匹配。但是,我已经解决并回答了。但现在我需要一个新的 def函数,它删除某个(给定 refName )联系人及其
这个问题在这里已经有了答案: Horizontal list items (7 个答案) 关闭 9 年前。
我想创建一个新的 float 类型,大小为 128 位,指数为 4 字节(32 位),小数为 12 字节(96 位),我该怎么做输入 C++,我将能够在其中进行输入、输出、+、-、*、/操作。 [我正
我在放置引用计数指针的实例时遇到问题 类到我的数组类中。使用调试器,似乎永远不会调用构造函数(这会扰乱引用计数并导致行中出现段错误)! 我的 push_back 函数是: void push_back
我在我们的代码库中发现了经典的新建/删除不匹配错误,如下所示: char *foo = new char[10]; // do something delete foo; // instead of
A *a = new A(); 这是创建一个指针还是一个对象? 我是一个 c++ 初学者,所以我想了解这个区别。 最佳答案 两者:您创建了一个新的 A 实例(一个对象),并创建了一个指向它的名为 a
我是一名优秀的程序员,十分优秀!